Equivalente ao Linux 'touch' para criar um arquivo vazio com o PowerShell? [duplicado]

135

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.

    
por jsalonen 07.11.2012 / 20:28

14 respostas

141

Usando o redirecionador de acréscimo "> >" resolve o problema em que um arquivo existente é excluído:

echo $null >> filename
    
por 07.11.2012 / 20:36
74

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
    }
}
    
por 25.03.2013 / 13:47
68

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
    
por 24.01.2013 / 07:39
24

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

Fonte

    
por 07.11.2012 / 20:32
10

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
    
por 30.09.2014 / 07:10
8

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
    
por 26.01.2013 / 01:33
7

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!

    
por 15.06.2017 / 18:45
4

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
    
por 08.03.2013 / 13:47
4
ac file.txt $null

Não excluirá o conteúdo do arquivo, mas também não atualizará a data.

    
por 12.08.2013 / 14:52
4

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.

    
por 09.03.2017 / 00:30
3

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.

    
por 25.02.2013 / 23:19
2

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.

    
por 06.05.2016 / 08:21
1

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)

    
por 02.11.2015 / 15:58
1

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:

  • Caminhos em outros diretórios
  • Credential para caminhos de rede
  • Verbose , Debug e WhatIf flags
  • curingas (somente atualização de registro de data e hora)
por 22.03.2017 / 18:21