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

Äquivalent von Linux `touch` zum Erstellen einer leeren Datei mit PowerShell?

Gibt es in PowerShell ein Äquivalent zu touch?

Unter Linux kann ich z. B. eine neue leere Datei erstellen, indem ich folgendes aufrufe:

touch filename

Unter Windows ist das ziemlich umständlich - normalerweise öffne ich einfach eine neue Instanz von Notepad und speichere eine leere Datei.

Gibt es also eine programmatische Möglichkeit in PowerShell, dies zu tun?

Ich bin nicht auf der Suche nach einer exakten Übereinstimmung mit dem Verhalten von touch, sondern nur nach dem einfachsten möglichen Äquivalent zum Erstellen leerer Dateien.

Antworten (14)

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

Die Verwendung des Append-Redirectors “>>” behebt das Problem, bei dem eine vorhandene Datei gelöscht wird:

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

Um eine leere Datei zu erstellen:

New-Item -ItemType file example.txt

Um den Zeitstempel einer Datei zu aktualisieren:

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

Hier ist eine Version, die eine neue Datei erstellt, wenn sie nicht existiert, oder den Zeitstempel aktualisiert, wenn sie existiert.

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 können Sie eine ähnliche Touch-Funktion wie folgt erstellen:

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

Verwendung:

touch myfile.txt Quelle

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

Ich bevorzuge

fc > filename

für diese Aufgabe. Um mit nicht leeren Dateien zu arbeiten, können Sie

fc >> filename

verwenden. fc ist einfach ein Alias für Format-Custom . Ich habe es gewählt, weil es ein kurzer Befehl ist, der in diesem Zusammenhang nichts tut, noop . Es ist auch nett, denn wenn Sie die Umleitung

fc filename

vergessen, gibt es keine Fehlermeldung, sondern macht wieder einfach nichts. Einige andere Aliasnamen, die funktionieren, sind

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

Es gibt bereits eine Reihe von würdigen Antworten, aber ich mag den Alias von New-Item, der einfach lautet: ni

Sie können auch auf die Dateityp-Deklaration verzichten (von der ich annehme, dass sie implizit ist, wenn eine Erweiterung hinzugefügt wird), so dass ich, um eine Javascript-Datei mit dem Namen ‘x’ in meinem aktuellen Verzeichnis zu erstellen, einfach schreiben kann:

ni x.js

3 Zeichen schneller als Touch!

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

Ich habe verschiedene Quellen zusammengesucht und bin zu folgendem Ergebnis gekommen, das meinen Anforderungen entsprach. Ich musste das Schreibdatum einer DLL setzen, die auf einem Rechner in einer anderen Zeitzone erstellt wurde:

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

Natürlich kann man es auch für mehrere Dateien setzen:

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

Es sieht so aus, als ob ein Teil der Antworten hier die Dateikodierung nicht berücksichtigt.

Ich bin gerade auf dieses Problem gestoßen, aus verschiedenen anderen Gründen, aber

echo $null > $file

$null > $file

erzeugen beide eine UTF-16-LE-Datei, während

New-Item $file -type file

eine UTF-8-Datei erzeugen.

fc > $file und fc >> $file scheinen, aus welchem Grund auch immer, ebenfalls UTF-8-Dateien zu erzeugen.

Out-File $file -encoding utf8

liefert eine UTF-8-BOM-Datei, während

Out-File $file -encoding ascii

eine UTF-8-Datei liefert. Andere gültige (aber nicht getestete) Kodierungen, die Out-File unterstützt, sind: [[-Encoding] {unbekannt | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Sie können auch Dinge über die Pipeline an Out-File übergeben, um der Datei einige Textdaten zum Speichern zu geben, und auch ein -append-Flag. Zum Beispiel:

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

Dieses Beispiel aktualisiert den Zeitstempel aus irgendeinem Grund nicht, aber dieses tut es:

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

Obwohl es den Nebeneffekt hat, “foo” an das Ende der Datei anzuhängen.

Wenn Sie sich nicht sicher sind, welche Kodierung Sie haben, habe ich festgestellt, dass VS-Code eine nette Funktion hat, bei der in der unteren rechten Ecke steht, welche Kodierung es ist. Ich glaube, Notepad++ hat auch eine ähnliche Funktion.

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

Öffnen Sie Ihre Profildatei:

notepad $profile

Fügen Sie die folgende Zeile hinzu:

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

Speichern Sie sie und laden Sie Ihr $profile neu, um es sofort zu verwenden. (Kein Schließen und Öffnen der Powershell erforderlich)

. $profile

Um eine neue Datei im aktuellen Verzeichnis hinzuzufügen, geben Sie ein:

touch testfile.txt

Um eine neue Datei im Verzeichnis “myfolder” hinzuzufügen, geben Sie ein:

touch myfolder\testfile.txt

Wenn eine Datei mit demselben Namen bereits existiert, wird sie nicht überschrieben. Stattdessen erhalten Sie eine Fehlermeldung.

Ich hoffe, das hilft

Bonustipp:

Sie können das Äquivalent zu ‘mkdir’ machen, indem Sie die folgende Zeile hinzufügen:

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

Gleiche Verwendung:

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

Löscht den Dateiinhalt nicht, aktualisiert aber auch nicht das Datum.

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

Für das von Ihnen beschriebene Szenario (wenn die Datei nicht existiert) ist dies schnell und einfach:

PS> sc example.txt $null

Die andere übliche Verwendung von touch ist jedoch die Aktualisierung des Zeitstempels der Datei. Wenn Sie versuchen, mein sc-Beispiel auf diese Weise zu verwenden, wird es den Inhalt der Datei löschen.

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

Um eine leere Datei unter Windows zu erstellen, geht es am schnellsten wie folgt:

fsutil file createnew file.name 0

Die Null ist die Dateigröße in Bytes, so dass dies auch nützlich ist, um große Dateien zu erstellen (sie sind nicht nützlich, um die Komprimierung zu testen, da sie keine tatsächlichen Daten enthalten und zu so gut wie nichts komprimiert werden)

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

Die Webseite http://xahlee.info/powershell/PowerShell_for_unixer.html schlägt vor:

new-item -type file [filename]

und dies erzeugt tatsächlich eine neue Datei der Größe Null.

Dies führt die andere Funktion von Unix touch nicht aus, nämlich den Zeitstempel zu aktualisieren, wenn filename bereits existiert, aber die Frage impliziert, dass der Benutzer einfach interaktiv eine Datei der Größe Null erstellen möchte, ohne auf Notepad zurückzugreifen.

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

Ich habe den Namen “Write-File” verwendet, weil “Touch” kein zugelassenes PowerShell-Verb ist. Ich verwende jedoch weiterhin den Alias “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

Verwendung:

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

Unterstützt:

  • Pfade in anderen Verzeichnissen
  • Credential für Netzwerkpfade
  • Verbose, Debug und WhatIf-Flags
  • Wildcards (nur Zeitstempel-Aktualisierung)