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

Equivalente di Linux `touch` per creare un file vuoto con PowerShell?

In PowerShell c'è un equivalente di touch?

Per esempio in Linux posso creare un nuovo file vuoto invocando:

touch filename

Su Windows questo è piuttosto scomodo – di solito apro semplicemente una nuova istanza di notepad e salvo un file vuoto.

Quindi c'è un modo programmatico in PowerShell per fare questo?

Non sto cercando di far corrispondere esattamente il comportamento di touch, ma solo di trovare l'equivalente più semplice possibile per creare file vuoti.

Risposte (14)

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

L'uso del reindirizzatore append “>>” risolve il problema in cui un file esistente viene cancellato:

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

Per creare un file vuoto:

New-Item -ItemType file example.txt

Per aggiornare il timestamp di un file:

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

Ecco una versione che crea un nuovo file se non esiste o aggiorna il timestamp se esiste.

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

In PowerShell potete creare una funzione Touch simile come questa:

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

Uso:

touch myfile.txt Fonte

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

Preferisco

fc > filename

per questo compito. Per lavorare con file non vuoti puoi usare

fc >> filename

fc è semplicemente un alias di Format-Custom . L'ho scelto perché è un comando breve che non fa nulla in questo contesto, noop . È anche carino perché se dimentichi il redirect

fc filename

invece di darti un errore, di nuovo non fa nulla. Alcuni altri alias che funzionano sono

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

Ci sono già un sacco di risposte degne di nota, ma mi piace molto l'alias di New-Item che è semplicemente: ni

Si può anche rinunciare alla dichiarazione del tipo di file (che presumo sia implicita quando viene aggiunta un'estensione), così per creare un file javascript con il nome di ‘x’ nella mia directory corrente posso semplicemente scrivere:

ni x.js

3 caratteri più veloce del touch!

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

Ho messo insieme vari sorgenti e mi sono ritrovato con il seguente, che ha soddisfatto le mie esigenze. Avevo bisogno di impostare la data di scrittura di una DLL costruita su una macchina con un diverso fuso orario:

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

Naturalmente, è possibile impostarla anche per più file:

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

Sembra che un sacco di risposte qui non tengano conto della codifica del file.

Mi sono appena imbattuto in questo problema, per varie altre ragioni, ma

echo $null > $file

$null > $file

producono entrambi un file UTF-16-LE, mentre

New-Item $file -type file

produce un file UTF-8.

Per qualche ragione fc > $file e fc >> $file, sembrano anch'essi produrre file UTF-8.

Out-File $file -encoding utf8

vi dà un file UTF-8-BOM, mentre

Out-File $file -encoding ascii

vi dà un file UTF-8. Altre codifiche valide (ma non testate) che Out-File supporta sono: [[-Encoding] {unknown | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Puoi anche inviare roba all'Out-File per dare al file dei dati di testo da memorizzare, e anche un flag -append. Per esempio:

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

questo esempio non aggiorna il timestamp per qualche motivo, ma questo lo fa:

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

Anche se ha l'effetto collaterale di aggiungere “foo” alla fine del file.

Se non siete sicuri di quale codifica avete, ho scoperto che VS-Code ha una caratteristica carina dove nell'angolo in basso a destra dice qual è la codifica. Penso che anche Notepad++ abbia una funzione simile.

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

Aprite il vostro file di profilo:

notepad $profile

Aggiungere la seguente linea:

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

Salva e ricarica il tuo $profilo per usarlo subito. (Non c'è bisogno di chiudere e aprire powershell)

. $profile

Per aggiungere un nuovo file nella directory corrente digitate:

touch testfile.txt

Per aggiungere un nuovo file nella directory ‘myfolder’ digitate:

touch myfolder\testfile.txt

Se un file con lo stesso nome esiste già, non verrà nascosto. Invece otterrete un errore.

Spero che aiuti

Suggerimento bonus:

Puoi fare l'equivalente di ‘mkdir’ aggiungendo la seguente linea:

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

Stesso uso:

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

Non cancellerà il contenuto del file ma non aggiornerà nemmeno la data.

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

Per lo scenario che hai descritto (quando il file non esiste), questo è facile e veloce:

PS> sc example.txt $null

Tuttavia, l'altro uso comune di touch è quello di aggiornare il timestamp del file. Se provate a usare il mio esempio di sc in questo modo, cancellerà il contenuto del file.

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

per creare un file vuoto in Windows, il modo più veloce è il seguente:

fsutil file createnew file.name 0

Lo zero è la dimensione del file in byte, quindi questo è anche utile per creare file di grandi dimensioni (non saranno utili per testare la compressione poiché non contengono dati reali e si comprimeranno fino a quasi nulla)

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

La pagina web http://xahlee.info/powershell/PowerShell_for_unixer.html suggerisce:

new-item -type file [filename]

e questo crea effettivamente un nuovo file di dimensione zero.

Questo non esegue l'altra funzione di Unix touch, cioè aggiornare il timestamp se filename esiste già, ma la domanda implica che l'utente vuole solo creare un file di dimensione zero in modo interattivo senza ricorrere al Blocco note.

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

Ho usato il nome “Write-File” perché “Touch” non è un verbo PowerShell approvato . Tuttavia, lo alias è ancora “Touch”.

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

Supporta:

  • Percorsi in altre directory
  • Credential per percorsi di rete
  • flag Verbose, Debug e WhatIf
  • caratteri jolly (solo aggiornamento timestamp)