Frage Äquivalent von Linux `touch`, um mit PowerShell eine leere Datei zu erstellen? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

In PowerShell gibt es ein Äquivalent von touch?

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

touch filename

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

Gibt es einen programmatischen Weg in PowerShell, um dies zu tun?

Ich suche nicht genau nach dem Verhalten der Berührung, sondern nach der einfachsten Möglichkeit, um leere Dateien zu erstellen.


133
2017-11-07 19:28


Ursprung


Sehen Windows-Version des Unix-Touch-Befehls & Windows-Äquivalent des Linux-Befehls 'touch'? - amiregelz
Vielen Dank. Ich schaute auf sie, aber die meisten der Antwort konzentrieren sich auf die Eingabeaufforderung. Ich hätte gerne eine PowerShell-Lösung, bei der ich keine neuen Anwendungen installieren muss. - jsalonen
Downvoted die Frage - beide Funktionen sind nur ein paar Zeilen mehr Code, nur beide implementieren, nicht nur die Hälfte, esp. wenn der fehlende halbe andere Befehl so gefährlich ist. - yzorg
@yzorg: Was meinst du mit beiden Funktionen? Ich habe nur gefragt, wie man eine leere Datei in PS erstellt, wie Sie es können touch in Linux. - jsalonen
@jsalonen Benutze * nix touch Bei einer bestehenden Datei wird die letzte Schreibzeit aktualisiert, ohne die Datei zu ändern, siehe die Links von @amiregelz. Diese Frage hat ein hohes Google-Ranking für powershell touchIch wollte Copy / Paste-ers darauf hinweisen, dass nur diese Hälfte Daten zerstören kann, wenn * nix touch nicht. Siehe @LittleBoyLost-Antwort, die behandelt, wenn die Datei bereits existiert. - yzorg


Antworten:


Das Verwenden des Append-Redirectors ">>" behebt das Problem, bei dem eine vorhandene Datei gelöscht wird:

echo $null >> filename

138
2017-11-07 19:36



Auch bekannt als 'echo null> Dateiname' an einer Eingabeaufforderung, möglicherweise eine Batch-Datei. Cool, um die PowerShell-Version zu sehen, danke! - Mark Allen
Berührung ist etwas anders als das, wenn die Datei bereits existiert - jk.
Echo ist unnötig, $null > filename funktioniert super. - alirobe
Dies schreibt 2 Byte Unicode BOM 0xFEFF für mich. - mlt
Wichtiger Hinweis: Viele Unix-Tools befassen sich nicht mit Stücklisten. Dies beinhaltet zum Beispiel git (auch unter Windows). Sie werden Probleme haben, wenn Sie auf diese Weise erstellte Dateien mit Werkzeugen verwenden, die Stücklisten nicht erkennen. z.B. du versuchst dein zu erstellen .gitignore Verwenden Sie diesen Befehl und wundern Sie sich, warum es nicht funktioniert. BOM ist der Grund. - martixy


Hier ist eine Version, die eine neue Datei erstellt, wenn sie nicht existiert, oder den Zeitstempel aktualisiert, falls dieser 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
    }
}

73
2018-03-25 12:47



Dies ist die richtige Antwort für das Replizieren des Unix-Touch-Programms (wenn auch mit einem anderen Namen), aber die Frage ist darauf ausgerichtet, einfach eine neue Datei zu erstellen. - Jamie Schembri
Sehr, sehr kleines Quibble: Während Touch-File der Verb-Nomen Namenskonvention von PS entspricht, Touch ist kein "anerkanntes" Verb (nicht dass es eine wesentliche Voraussetzung ist: msdn.microsoft.com/en-us/library/ms714428.aspx). File ist in Ordnung, übrigens. Ich empfehle die Namen Set-File oder Set-LastWriteTime oder, mein Liebling, Update-File. Außerdem würde ich empfehlen Add-Content $file $null Anstatt von echo $null > $file. Setzen Sie abschließend einen Alias ​​mit Set-Alias touch Update-File wenn Sie den Befehl weiterhin verwenden möchten touch - Alan McBee


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

63
2018-01-24 06:39



Ich denke, das ist der beste Ansatz! - Jayesh Bhoot
Funktioniert das zum Aktualisieren des Zeitstempels eines Ordners? - riahc3
@ Riahc3, benutze das: (gi MyFolder).LastWriteTime = Get-Date . Sie könnten das auch für Dateien verwenden. - dangph
Noch prägnanter: ni example.txt - Nick Cox
Diese Methode fügt die schrecklichen BOM-Bytes nicht hinzu und die Codierung scheint glücklicherweise UTF-8 zu sein. - Davos


In PowerShell können Sie eine ähnliche Touch-Funktion als solche erstellen:

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

Verwendung:

touch myfile.txt

Quelle


24
2017-11-07 19:32



Das ist großartig, danke! Genau was ich wollte! Irgendwelche Ideen, wie ich diese Funktion in die PowerShell installieren könnte, damit sie automatisch geladen wird, wenn ich die Shell starte? - jsalonen
Fügen Sie es Ihrer $ Profildatei hinzu. (Führen Sie notepad $ profile aus, um diese Datei zu bearbeiten.) - Mark Allen
Dies wird den Inhalt der Datei löschen, wenn sie existiert. - dangph


ich bevorzuge

fc > filename

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

fc >> filename

fc ist einfach ein Alias ​​für Format - Benutzerdefiniert. Ich habe es gewählt weil es ein kurzer Befehl ist, der in diesem Kontext nichts tut, a Noop. Es ist auch schön, denn wenn du das vergisst umleiten

fc filename

Anstatt dir einen Fehler zu geben, tut es auch wieder nichts. Einige andere Aliase das wird funktionieren

ft -> Format-Table
fw -> Format-Wide

10
2017-09-30 05:10





Ich stellte verschiedene Quellen zusammen und endete mit den folgenden, die meinen Bedürfnissen entsprachen. Ich musste das Schreibdatum einer DLL festlegen, die auf einem Computer 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

7
2018-01-26 00:33



+1 für den Powershell-ähnlichen Weg, LastWriteTime für eine Datei zu ändern (was ich brauchte), obwohl die Frage sich auf die neue Dateierstellungsfunktion des Berührungsbefehls konzentrierte. - Nathan Hartley
Ohne eine Variable zu verwenden? - riahc3


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

Sie können auch auf die Deklaration des Dateityps verzichten (was ich implizit annehmen kann, wenn eine Erweiterung hinzugefügt wird). 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 Touch!


6
2018-06-15 16:45



Das ist nicht idempotent ni : The file 'x.js' already exists - Steven Penny