Usando o redirecionador de acréscimo "> >" resolve o problema em que um arquivo existente é excluído:
echo $null >> filename
No PowerShell há um equivalente de touch
?
Por exemplo, no Linux, posso criar um novo arquivo vazio invocando:
touch filename
No Windows, isso é bastante complicado - normalmente eu apenas abro uma nova instância do bloco de notas e salvo um arquivo vazio.
Existe uma maneira programática no PowerShell de fazer isso?
Não estou tentando corresponder exatamente ao comportamento do toque, mas apenas para encontrar o equivalente mais simples possível para a criação de arquivos vazios.
Aqui está uma versão que cria um novo arquivo se ele não existir ou atualiza o timestamp se ele existir.
Function Touch-File
{
$file = $args[0]
if($file -eq $null) {
throw "No filename supplied"
}
if(Test-Path $file)
{
(Get-ChildItem $file).LastWriteTime = Get-Date
}
else
{
echo $null > $file
}
}
Para criar um arquivo em branco:
New-Item -ItemType file example.txt
Para atualizar o registro de data e hora de um arquivo:
(gci example.txt).LastWriteTime = Get-Date
No PowerShell, você pode criar uma função semelhante do Touch como tal:
function touch {set-content -Path ($args[0]) -Value ($null)}
Uso:
touch myfile.txt
Eu prefiro
fc > filename
para esta tarefa. Para trabalhar com arquivos não vazios, você pode usar
fc >> filename
fc
é simplesmente um alias para
Format-Custom . Eu escolhi
porque é um comando curto que não faz nada neste contexto, um
noop . Também é bom porque se você esquecer o
redirecionar
fc filename
em vez de lhe dar um erro, novamente ele não faz nada. Alguns outros aliases que vai funcionar são
ft -> Format-Table
fw -> Format-Wide
Eu reuni várias fontes e terminei com o seguinte, que atendeu às minhas necessidades. Eu precisava definir a data de gravação de uma DLL que foi criada em uma máquina em um fuso horário diferente:
$update = get-date
Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update
Claro, você também pode configurá-lo para vários arquivos:
Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
Já existem várias respostas dignas, mas gosto bastante do alias de New-Item, que é apenas: ni
Você também pode abrir mão da declaração de tipo de arquivo (que eu suponho ser implícita quando uma extensão é adicionada), então para criar um arquivo javascript com o nome 'x' no meu diretório atual eu posso simplesmente escrever:
ni x.js
3 caracteres mais rápidos que o toque!
Abra o seu arquivo de perfil:
notepad $profile
Adicione a seguinte linha:
function touch {New-Item "$args" -ItemType File}
Salve e recarregue seu perfil $ para usá-lo imediatamente. (Não há necessidade de fechar e abrir o powershell)
. $profile
Para adicionar um novo arquivo no tipo de diretório atual:
touch testfile.txt
Para adicionar um novo arquivo dentro do tipo de diretório 'myfolder':
touch myfolder\testfile.txt
Se um arquivo com o mesmo nome já existir, ele não será substituído. Em vez disso, você receberá um erro.
Espero que ajude
Dica de bônus:
Você pode fazer o equivalente a 'mkdir' adicionando a seguinte linha:
function mkdir {New-Item "$args" -ItemType Directory}
Mesma utilização:
mkdir testfolder
mkdir testfolder\testsubfolder
ac file.txt $null
Não excluirá o conteúdo do arquivo, mas também não atualizará a data.
Parece que muitas das respostas aqui não levam em conta a codificação de arquivos.
Acabei de me deparar com este problema, por várias outras razões, mas
echo $null > $file
$null > $file
ambos produzem um arquivo UTF-16-LE, enquanto
New-Item $file -type file
produz um arquivo UTF-8.
Por alguma razão fc > $file
e fc >> $file
, também parecem produzir arquivos UTF-8.
Out-File $file -encoding utf8
fornece um arquivo UTF-8-BOM, enquanto
Out-File $file -encoding ascii
fornece um arquivo UTF-8. Outras codificações válidas (mas não testadas) que o Out-File suporta são: [[-Encoding] {unknown | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | padrão | oem}]. Você também pode canalizar o material para Out-File para fornecer ao arquivo alguns dados de texto a serem armazenados e também um sinalizador -append. Por exemplo:
echo $null | Out-File .\stuff.txt -Encoding ascii -Append
este exemplo não atualiza o timestamp por algum motivo, mas este faz:
echo foo | Out-File .\stuff.txt -Encoding ascii -Append
Embora tenha o efeito colateral de acrescentar "foo" ao final do arquivo.
Se você não tem certeza sobre qual codificação você tem, descobri que o VS-Code tem um recurso bacana onde, no canto inferior direito, diz qual é a codificação. Eu acho que o Notepad ++ também tem um recurso semelhante.
Para o cenário que você descreveu (quando o arquivo não existe), isso é rápido e fácil:
PS> sc example.txt $null
No entanto, o outro uso comum de touch
é atualizar o registro de data e hora do arquivo. Se você tentar usar meu exemplo sc
dessa maneira, ele apagará o conteúdo do arquivo.
A página da web link sugere:
new-item -type file [filename]
e isso de fato cria um novo arquivo de tamanho zero.
Isso não executa a outra função do Unix touch
, a saber, atualizar o timestamp se nome_do_arquivo já existe, mas a questão implica que o usuário apenas deseja criar um arquivo de tamanho zero interativamente sem recorrer ao Bloco de Notas.
para criar um arquivo vazio no windows, a maneira de jejuar é a seguinte:
fsutil file createnew file.name 0
O zero é tamanho do arquivo em bytes, então isso também é útil para criar um arquivo grande (eles não serão úteis para testar a compactação, pois eles não contêm dados reais e irão compactar para praticamente nada)
Eu usei o nome "Write-File" porque "Touch" não é um aprovado verbo PowerShell . Eu ainda alias como toque, no entanto.
Touch.psm1
<#
.Synopsis
Creates a new file or updates the modified date of an existing file.
.Parameter Path
The path of the file to create or update.
#>
Function Write-File {
[CmdletBinding()]
Param(
[Parameter( Mandatory=$True, Position=1 )]
[string] $Path,
[switch] $WhatIf,
[System.Management.Automation.PSCredential] $Credential
)
$UseVerbose = $PSCmdlet.MyInvocation.BoundParameters['Verbose'].IsPresent -eq $True
$UseDebug = $PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent -eq $True
$TimeStamp = Get-Date
If( -Not [System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters( $Path ) ) {
New-Item -ItemType:File -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -ErrorAction SilentlyContinue -Confirm:$False | Out-Null
}
Set-ItemProperty -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -Name LastWriteTime -Value:$TimeStamp -Confirm:$False | Out-Null
}
Set-Alias -Name touch -Value Write-File
Export-ModuleMember -Function Write-File
Export-ModuleMember -Alias touch
Uso:
Import-Module ./Touch.psm1
touch foo.txt
Suporta:
Credential
para caminhos de rede Verbose
, Debug
e WhatIf
flags