2012-11-07 19:28:02 +0000 2012-11-07 19:28:02 +0000
180
180

Equivalente ao `touch` do Linux para criar um ficheiro vazio com PowerShell?

No PowerShell existe um equivalente a touch?

Por exemplo, no Linux posso criar um novo ficheiro vazio invocando:

touch filename

No Windows isto é bastante embaraçoso – normalmente apenas abro uma nova instância de bloco de notas e guardo um ficheiro vazio.

Então existe uma forma programática no PowerShell para fazer isto?

Não estou a procurar corresponder exactamente ao comportamento de toque, mas apenas encontrar o equivalente mais simples possível para criar ficheiros vazios.

Respostas (14)

171
171
171
2012-11-07 19:36:41 +0000

Usando o redireccionador de anexos “>>” resolve o problema onde um ficheiro existente é eliminado:

echo $null >> filename
113
113
113
2013-01-24 06:39:09 +0000

Para criar um ficheiro em branco:

New-Item -ItemType file example.txt

Para actualizar o carimbo temporal de um ficheiro:

(gci example.txt).LastWriteTime = Get-Date
78
78
78
2013-03-25 12:47:36 +0000

Aqui está uma versão que cria um novo ficheiro se este não existir ou actualiza o carimbo da hora, se 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
    }
}
24
24
24
2012-11-07 19:32:59 +0000

No PowerShell pode criar uma função Touch semelhante como tal:

function touch {set-content -Path ($args[0]) -Value ($null)}

Utilização:

touch myfile.txt Fonte

14
14
14
2014-09-30 05:10:25 +0000

Eu prefiro

fc > filename

para esta tarefa. Para trabalhar com ficheiros não vazios pode usar

fc >> filename

fc é simplesmente um pseudónimo de Format-Custom . Escolhi-o porque é um pequeno comando que nada faz neste contexto, noop . Também é agradável porque se esquecer o redireccionamento

fc filename

em vez de lhe dar um erro, mais uma vez não faz nada. Alguns outros pseudónimos que funcionarão são

ft -> Format-Table
fw -> Format-Wide
```.
11
11
11
2017-06-15 16:45:40 +0000

Já há um monte de respostas dignas, mas gosto bastante do pseudónimo de New-Item que é apenas: ni

Pode também renunciar à declaração do tipo de ficheiro (que presumo estar implícita quando é adicionada uma extensão), por isso para criar um ficheiro javascript com o nome de ‘x’ no meu directório actual, posso simplesmente escrever:

ni x.js

3 caracteres mais rápido do que o toque!

8
8
8
2013-01-26 00:33:10 +0000

Reuni várias fontes, e terminei com as seguintes, que satisfizeram as minhas necessidades. Precisava de definir a data de escrita de uma DLL que foi construída numa máquina num fuso horário diferente:

$update = get-date
Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update

É claro que também se pode definir para múltiplos ficheiros:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
6
6
6
2017-03-08 23:30:09 +0000

Parece que um monte de respostas aqui não contabiliza a codificação de ficheiros.

acabei de me deparar com este problema, por várias outras razões, mas

echo $null > $file

$null > $file

ambos produzem um ficheiro UTF-16-LE, enquanto que

New-Item $file -type file

produz um ficheiro UTF-8.

Por qualquer razão fc > $file e fc >> $file, também parecem produzir ficheiros UTF-8.

Out-File $file -encoding utf8

dá-lhe um ficheiro UTF-8-BOM, enquanto que

Out-File $file -encoding ascii

dá-lhe um ficheiro UTF-8. Outras codificações válidas (mas não testadas) que suportam Out-File são: [[-Encodificação] {unknown | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Pode também canalizar coisas para Out-File para dar ao ficheiro alguns dados de texto a armazenar, e também uma bandeira -append. Por exemplo:

echo $null | Out-File .\stuff.txt -Encoding ascii -Append

este exemplo não actualiza o carimbo da hora por alguma razão, mas este faz:

echo foo | Out-File .\stuff.txt -Encoding ascii -Append

Embora tenha o efeito secundário de anexar “foo” ao fim do ficheiro.

Se não tiver a certeza sobre a codificação que tem, descobri que o VS-Code tem uma característica elegante onde no canto inferior direito diz o que é a codificação. Penso que o Notepad++ também tem uma característica semelhante.

5
5
5
2013-03-08 12:47:19 +0000

Abra o seu ficheiro de perfil:

notepad $profile

Adicione a seguinte linha:

function touch {New-Item "$args" -ItemType File}

Guarde-o e recarregue o seu ficheiro $ para o utilizar de imediato. (Não há necessidade de fechar e abrir powerhell)

. $profile

Para adicionar um novo ficheiro no tipo de directório actual:

touch testfile.txt

Para adicionar um novo ficheiro dentro do directório ‘myfolder’ digite:

touch myfolder\testfile.txt

Se já existir um ficheiro com o mesmo nome, este não será sobreposto. Em vez disso, receberá um erro.

Espero que ajude

Bonus tip:

Pode fazer o equivalente a ‘mkdir’ adicionando a seguinte linha:

function mkdir {New-Item "$args" -ItemType Directory}

O mesmo uso:

mkdir testfolder
mkdir testfolder\testsubfolder
5
5
5
2013-08-12 12:52:52 +0000
ac file.txt $null

Não elimina o conteúdo do ficheiro mas também não actualiza a data.

3
3
3
2013-02-25 22:19:10 +0000

Para o cenário que descreveu (quando o ficheiro não existe), isto é rápido e fácil:

PS> sc example.txt $null

Contudo, a outra utilização comum de touch é actualizar o carimbo da hora do ficheiro. Se tentar utilizar o meu exemplo sc dessa forma, ele apagará o conteúdo do ficheiro.

2
2
2
2015-11-02 14:58:44 +0000

para criar um ficheiro vazio no Windows, a forma mais rápida é a seguinte:

fsutil file createnew file.name 0

O zero é ficheiro em bytes, pelo que também é útil para criar um ficheiro grande (não serão úteis para testar a compressão, uma vez que não contêm dados reais e não comprimem praticamente nada)

2
2
2
2016-05-06 06:21:30 +0000

A página web http://xahlee.info/powershell/PowerShell_for{_unixer.html sugere:

new-item -type file [filename]

e isto cria, de facto, um novo ficheiro de tamanho zero.

Isto não desempenha a outra função do Unix touch, nomeadamente actualizar o carimbo da hora se filename já existir, mas a questão implica que o utilizador apenas quer criar um ficheiro de tamanho zero interactivamente sem recorrer ao Notepad.

2
2
2
2017-03-22 17:21:01 +0000

Utilizei o nome “Write-File” porque “Touch” não é um verbo aprovado PowerShell . No entanto, continuo a apelidá-lo de “Tocar”.

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

Utilização:

Import-Module ./Touch.psm1
touch foo.txt

Apoios:

  • Caminhos em outros directórios
  • Credential para caminhos de rede
  • Verbose, Debug, e WhatIf bandeiras & - wildcards (apenas actualização de timestamp)