Entspricht Linux "touch", um eine leere Datei mit PowerShell zu erstellen?

141605
jsalonen

Gibt es in PowerShell ein Äquivalent dazu touch?

Zum Beispiel kann ich in Linux eine neue leere Datei erstellen, indem ich Folgendes aufrufe:

touch filename 

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

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

Ich bin nicht darauf aus, das Verhalten der Berührungen genau anzupassen, sondern nur das einfachste Äquivalent zum Erstellen leerer Dateien zu finden.

136
Siehe [Windows-Version des Unix-Touchbefehls] (http://stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command) & [Windows-Entsprechung des Linux-Befehls "touch"?] (http://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch) amiregelz vor 11 Jahren 1
Vielen Dank. Ich schaute sie an, aber der Großteil der Antwort konzentrierte sich auf die Eingabeaufforderung. Ich hätte gerne eine PowerShell-Lösung, bei der ich keine neuen Anwendungen installieren muss. jsalonen vor 11 Jahren 0
Die Frage wurde unterschlagen - beide Funktionen bestehen nur aus wenigen Codezeilen. Sie müssen nur beide implementieren, nicht nur die Hälfte. Wenn der fehlende halbe andere Befehl so gefährlich ist. yzorg vor 10 Jahren 0
@ yzorg: Was meinst du mit beiden Funktionen? Ich habe nur gefragt, wie man eine leere Datei in PS erstellt, wie man es unter Linux mit "touch" tun kann. jsalonen vor 10 Jahren 0
@jsalonen Verwenden Sie * nix `touch 'für eine vorhandene Datei. Die letzte Schreibzeit wird aktualisiert, ohne die Datei zu ändern. Siehe die Links von @amiregelz. Diese Frage hat ein hohes Google-Ranking für "Powershell Touch". Ich wollte Copy / Pasteers darauf hinweisen, dass nur diese Hälfte Daten zerstören kann, wenn * Nix Touch dies nicht tut. Siehe @LittleBoyLost-Antwort, die behandelt, wenn die Datei bereits vorhanden ist. yzorg vor 10 Jahren 0
@jsalonen IOW Wenn Sie die Frage zu "Wie man eine leere Datei in Powershell erstellt" umformuliert, würde ich mein Downvote entfernen, aber den Befehl * nix `touch` nicht ausführen. :) yzorg vor 10 Jahren 0
@ LưuVĩnhPhúc Die Frage wurde klarer. Ich suche nicht nach einem vollständigen Feature-Äquivalent für die Berührung, sondern nur nach dem Übereinstimmungsverhalten für die Erstellung leerer Dateien. jsalonen vor 7 Jahren 0

14 Antworten auf die Frage

143
Yash Agarwal

Mit dem Append-Redirector ">>" wird das Problem behoben, bei dem eine vorhandene Datei gelöscht wird:

echo $null >> filename 
Entschuldigung, tut es nicht. Es gibt so etwas wie `cmdlet Copy-Item an der Befehlspipeline Position 1 Geben Sie Werte für die folgenden Parameter ein:` jsalonen vor 11 Jahren 0
Drücken Sie einfach die Eingabetaste, es wird ein Fehler ausgegeben, aber ignorieren Sie dies. Ihre Datei wird erstellt. Yash Agarwal vor 11 Jahren 0
Eigentlich hast du recht, es funktioniert. Es ist jedoch ärgerlich, auf diese Weise zu arbeiten, wenn Sie so oft ausgeführt werden müssen. jsalonen vor 11 Jahren 0
OK. Ich habe die Ans geändert, jetzt sollte es in einer Zeile gemacht werden Yash Agarwal vor 11 Jahren 1
Von einer Eingabeaufforderung auch als "Echo-Null> Dateiname" bezeichnet, möglicherweise eine Batchdatei. Cool, um die PowerShell-Version zu sehen, danke! Mark Allen vor 11 Jahren 3
touch ist etwas anderes als das, wenn die Datei bereits existiert jk. vor 11 Jahren 16
Vielleicht wäre `echo $ null >> filename 'Unix * touch * ähnlicher. Nathan vor 10 Jahren 1
Echo ist nicht erforderlich, `$ null> Dateiname` funktioniert hervorragend. alirobe vor 9 Jahren 8
Dies schreibt 2 Byte Unicode-Stückliste 0xFEFF für mich. mlt vor 8 Jahren 6
Hey, es ändert die Kodierung in 'UTF-16 LE' Rahil Wazir vor 8 Jahren 1
@mlt Durch das Umleiten zu einer Datei in Powershell wird die Stückliste geschrieben. Diese Technik schreibt also auch die Stückliste. In dieser Frage wird erläutert, wie eine Datei in PS ohne die Stückliste geschrieben wird (es ist meines Erachtens unter anderem): http://stackoverflow.com/questions/5596982/using-powershell-to-write-a-file-in-utf-8 -ohne-das-bom Bender the Greatest vor 7 Jahren 1
Wichtiger Hinweis: Viele Unix-Tools behandeln keine Stücklisten. Dazu gehört zum Beispiel Git (auch unter Windows). Sie haben Probleme, wenn Sie auf diese Weise erstellte Dateien mit Tools verwenden, die keine Stücklisten erkennen. Sie versuchen z. B., Ihren `.gitignore` mit diesem Befehl zu erstellen, und fragen sich, warum es nicht funktioniert. BOM ist der Grund. martixy vor 7 Jahren 4
Ja - diese Methode schreibt tatsächlich einige Bytes in die Datei. Node.js kann auch nicht mit diesen Bytes umgehen und erzeugt am Anfang der Datei einen Syntaxfehler. TheHansinator vor 7 Jahren 0
Die Antwort mit `New-Item` sieht so aus, als würde die Stückliste nicht gesetzt und die Kodierung ist UTF-8. In letzter Zeit habe ich aber gerade das Linux-Subsystem für Windows oder nur git bash unter Windows und `Touch` ausgeführt. Ich starte git bash in einer Powershell, indem ich `&" c: \ Programme \ git \ bin \ bash.exe "` betreibe Davos vor 6 Jahren 0
74
LittleBoyLost

Hier ist eine Version, mit der eine neue Datei erstellt wird, wenn sie nicht vorhanden ist, oder der Zeitstempel aktualisiert wird, wenn er 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 } } 
Dies ist die richtige Antwort für das Replizieren des Unix-Touch-Programms (wenn auch mit einem anderen Namen). Die Frage ist jedoch darauf ausgerichtet, einfach eine neue Datei zu erstellen. Jamie Schembri vor 10 Jahren 4
Sehr, sehr winzige Kleinigkeiten: Während Touch-File der Verb-Noun-Namenskonvention von PS entspricht, ist "Touch" kein "genehmigtes" Verb (nicht jedoch eine wesentliche Anforderung: https://msdn.microsoft.com/de) -us / library / ms714428.aspx). `File` ist übrigens in Ordnung. Ich empfehle die Namen `Set-File` oder` Set-LastWriteTime` oder, mein Favorit, `Update-File`. Ich würde auch `Add-Content $ file $ null` anstelle von` echo $ null> $ file` empfehlen. Setzen Sie zum Schluss einen Alias ​​mit `Set-Alias ​​touch Update-File`, wenn Sie weiterhin den Befehl` touch` verwenden möchten Alan McBee vor 7 Jahren 11
70
dangph

So erstellen Sie eine leere Datei:

New-Item -ItemType file example.txt 

So aktualisieren Sie den Zeitstempel einer Datei:

(gci example.txt).LastWriteTime = Get-Date 
Ich denke, das ist der beste Ansatz! Jayesh Bhoot vor 10 Jahren 4
Funktioniert dies zum Aktualisieren des Zeitstempels eines Ordners? riahc3 vor 9 Jahren 0
@ riahc3, benutze folgendes: `(gi MyFolder) .LastWriteTime = Get-Date '. Sie könnten das auch für Dateien verwenden. dangph vor 9 Jahren 1
Noch viel mehr: `ni example.txt` Nick Cox vor 6 Jahren 4
Diese Methode fügt die schrecklichen Stücklisten-Bytes nicht hinzu und die Kodierung scheint glücklich UTF-8 zu sein. Davos vor 6 Jahren 1
24
Ƭᴇcʜιᴇ007

In PowerShell you can create a similar Touch function as such:

function touch 

Usage:

touch myfile.txt

Source

Das ist großartig, danke! Genau das, was ich wollte! Gibt es irgendwelche Ideen, wie ich diese Funktion in der PowerShell installieren könnte, damit sie beim Starten der Shell automatisch geladen wird? jsalonen vor 11 Jahren 0
Fügen Sie es Ihrer $ Profildatei hinzu. (Führen Sie das Editor $ -Profil aus, um diese Datei zu bearbeiten.) Mark Allen vor 11 Jahren 2
Dadurch wird der Inhalt der Datei gelöscht, falls vorhanden. dangph vor 11 Jahren 23
Oder die sichere Version, die den vorhandenen Dateiinhalt nicht löscht. Funktion touch } ` alastairtree vor 6 Jahren 1
10
Steven Penny

ich bevorzuge

fc > filename 

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

fc >> filename 

fcist einfach ein Alias ​​für Format-Custom . Ich habe es gewählt, weil es ein kurzer Befehl ist, der in diesem Zusammenhang nichts tut, ein Noop . Es ist auch schön, wenn man die Weiterleitung vergisst

fc filename 

Anstatt dir einen Fehler zu geben, tut es einfach nichts. Einige andere Aliase, die funktionieren werden, sind

ft -> Format-Table fw -> Format-Wide 
8
John Saunders

Ich habe verschiedene Quellen zusammengestellt und bin mit den folgenden Informationen fertig geworden, die meinen Bedürfnissen entsprachen. Ich musste das Schreibdatum einer DLL festlegen, die auf einer Maschine in einer anderen Zeitzone erstellt wurde:

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

Natürlich können Sie es auch für mehrere Dateien festlegen:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update 
+1 für die Powershell-Methode, um LastWriteTime in einer Datei zu ändern (was ich brauchte), obwohl sich die Frage auf die neue Dateierstellungsfunktion des Berührungsbefehls konzentrierte. Nathan Hartley vor 11 Jahren 1
Ohne eine Variable zu verwenden? riahc3 vor 9 Jahren 0
7
Jacob E. Dawson

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

Sie können auch auf die Dateitypdeklaration verzichten (was ich implizit beim Hinzufügen einer Erweiterung ansehe). Um eine Javascript-Datei mit dem Namen 'x' in meinem aktuellen Verzeichnis zu erstellen, kann ich einfach schreiben:

ni x.js 

3 Zeichen schneller als Berührung!

Dies ist kein idempotentes `ni: Die Datei 'x.js' existiert bereits ' Steven Penny vor 6 Jahren 0
4
RafaelGP

Open your profile file:

notepad $profile 

Add the following line:

function touch 

Save it and reload your $profile in order to use it straight away. (No need to close and open powershell)

. $profile 

To add a new file in the current directory type:

touch testfile.txt 

To add a new file inside 'myfolder' directory type:

touch myfolder\testfile.txt 

If a file with the same name already exists, it won't be overidden. Instead you'll get an error.

I hope it helps

Bonus tip:

You can make the equivalent of 'mkdir' adding the following line:

function mkdir 

Same use:

mkdir testfolder mkdir testfolder\testsubfolder 
4
8DH
ac file.txt $null 

Löscht den Inhalt der Datei nicht, aktualisiert aber auch nicht das Datum.

4
Garret Hoffman

Es sieht so aus, als würden einige Antworten hier nicht für die Dateikodierung verantwortlich sein.

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

echo $null > $file  $null > $file 

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

New-Item $file -type file 

erzeugt eine UTF-8-Datei.

Aus welchem Grunde fc > $fileund fc >> $filescheint auch UTF-8 - Dateien zu erzeugen.

Out-File $file -encoding utf8 

gibt Ihnen eine UTF-8-BOM-Datei, während

Out-File $file -encoding ascii 

gibt Ihnen eine UTF-8-Datei. Andere gültige (aber nicht getestete) Kodierungen, die Out-File unterstützt, sind: [[-Encoding] ]. Sie können auch Daten an Out-File weiterleiten, um der Datei einige zu speichernde Textdaten sowie ein -append-Flag zu geben. Zum Beispiel:

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

In diesem Beispiel wird der Zeitstempel aus irgendeinem Grund nicht aktualisiert, aber in diesem Beispiel gilt Folgendes:

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

Obwohl es den Nebeneffekt hat, dass "foo" an das Ende der Datei angehängt wird.

Wenn Sie sich nicht sicher sind, welche Kodierung Sie haben, habe ich festgestellt, dass VS-Code eine praktische Funktion hat, in der sich in der rechten unteren Ecke die Kodierung befindet. Ich denke, Notepad ++ hat auch eine ähnliche Funktion.

`Set-Content -Path $ file -value $ null` erledigt den Job und wirkt sich nicht auf die Dateicodierung aus. Überprüfen Sie auch [ss64-Version von `touch`] (https://ss64.com/ps/syntax-touch.html). Anton Krouglov vor 7 Jahren 0