Entspricht Linux `touch`, um mit PowerShell eine leere Datei zu erstellen? [Duplikat]

167

Diese Frage hat hier bereits eine Antwort:

Gibt es in PowerShell ein Äquivalent von touch?

Unter Linux kann ich beispielsweise eine neue leere Datei erstellen, indem ich Folgendes aufrufe:

touch filename

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

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

Ich versuche nicht, das Berührungsverhalten genau abzugleichen, sondern nur das einfachste Äquivalent zum Erstellen leerer Dateien zu finden.

jsalonen
quelle
Vielen Dank. Ich habe sie angeschaut, aber die meisten Antworten konzentrieren sich auf die Eingabeaufforderung. Ich hätte gerne eine PowerShell-Lösung, bei der ich keine neuen Anwendungen installieren muss.
jsalonen
Abgestimmt die Frage - beide Funktionen sind nur ein paar Zeilen mehr Code, implementieren Sie einfach beide, nicht nur die Hälfte, esp. wenn die fehlende Hälfte anderer Befehl so gefährlich ist.
Yzorg
@yzorg: Was meinst du mit beiden Funktionen? Ich habe nur gefragt, wie man eine leere Datei in PS so erstellt, wie man es touchin Linux machen kann.
Jsalonen
@jsalonen Verwenden Sie * nix touchfür eine vorhandene Datei, um die letzte Schreibzeit zu aktualisieren, ohne die Datei zu ändern. Siehe die Links von @amiregelz. Diese Frage hat ein hohes Google-Ranking powershell touch. Ich wollte Kopierer darauf aufmerksam machen, dass nur diese eine Hälfte Daten zerstören kann, wenn * nix touch dies nicht tut. Siehe @LittleBoyLost-Antwort, die behandelt, wenn die Datei bereits vorhanden ist.
Yzorg

Antworten:

165

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

echo $null >> filename
Yash Agarwal
quelle
3
Wird an einer Eingabeaufforderung auch als 'echo null> filename' bezeichnet, möglicherweise als Batchdatei. Cool, um die PowerShell-Version davon zu sehen, danke!
Mark Allen
16
touch ist etwas anderes als dies, wenn die Datei bereits existiert
jk.
9
Echo ist unnötig, $null > filenamefunktioniert super.
Alirobe
8
Dies schreibt 2 Bytes Unicode BOM 0xFEFF für mich.
mlt
4
Wichtiger Hinweis: Viele Unix-Tools arbeiten nicht mit Stücklisten. Dazu gehört beispielsweise Git (auch unter Windows). Sie haben Probleme, wenn Sie auf diese Weise erstellte Dateien mit Tools verwenden, die Stücklisten nicht erkennen. Du versuchst zB .gitignoremit diesem Befehl einen zu erstellen und fragst dich , warum das nicht funktioniert. Stückliste ist der Grund.
Martixy
96

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
dangph
quelle
4
Ich denke das ist der beste Ansatz!
Jayesh Bhoot
Funktioniert dies zum Aktualisieren des Zeitstempels eines Ordners?
riahc3
1
@ riahc3, verwenden Sie diese: (gi MyFolder).LastWriteTime = Get-Date. Sie können dies auch für Dateien verwenden.
Dangph
9
Noch markiger:ni example.txt
Nick Cox
2
Diese Methode fügt die schrecklichen Stücklistenbytes nicht hinzu und die Codierung scheint glücklich UTF-8 zu sein.
Davos
75

In dieser Version wird eine neue Datei erstellt, wenn sie nicht vorhanden ist, oder der Zeitstempel aktualisiert, wenn er vorhanden ist.

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
    }
}
LittleBoyLost
quelle
4
Dies ist die richtige Antwort für das Replizieren des Unix-Touch-Programms (allerdings mit einem anderen Namen), aber die Frage ist darauf ausgerichtet, einfach eine neue Datei zu erstellen.
Jamie Schembri
14
Sehr, sehr kleines Problem: Während Touch-File der Verb-Noun-Namenskonvention von PS entspricht, Touchhandelt es sich nicht um ein "zugelassenes" Verb (dies ist jedoch keine wesentliche Voraussetzung: msdn.microsoft.com/en-us/library/ms714428 aspx ). Fileist in Ordnung, übrigens. Ich empfehle die Namen Set-Fileoder Set-LastWriteTimeoder, mein Favorit, Update-File. Auch würde ich Add-Content $file $nullstatt empfehlen echo $null > $file. Legen Set-Alias touch Update-FileSie schließlich einen Alias ​​für fest, wenn Sie den Befehl weiterhin verwenden möchtentouch
Alan McBee,
Schlagen Sie vor, dies als letzte Zeile New-Alias -Name Touch Touch-File
hinzuzufügen
25

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

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

Verwendungszweck:

touch myfile.txt

Quelle

ƬᴇcƬᴇιʜ007
quelle
Das ist großartig, danke! Genau das, was ich wollte! Gibt es Ideen, wie ich diese Funktion in die PowerShell installieren könnte, damit sie automatisch geladen wird, wenn ich die Shell starte?
jsalonen
2
Fügen Sie es Ihrer $ profile-Datei hinzu. (Führen Sie notepad $ profile aus, um diese Datei zu bearbeiten.)
Mark Allen
25
Dies löscht den Inhalt der Datei, falls vorhanden.
dangph
1
Oder die sichere Version, die vorhandene Dateiinhalte nicht function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
löscht
13

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 bewirkt , ein Noop . Es ist auch schön, wenn Sie die Umleitung vergessen

fc filename

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

ft -> Format-Table
fw -> Format-Wide
Steven Penny
quelle
9

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

Sie können auch auf die Dateitypdeklaration verzichten (von der ich annehme, dass sie impliziert ist, wenn eine Erweiterung hinzugefügt wird). Um eine Javascript-Datei mit dem Namen 'x' in meinem aktuellen Verzeichnis zu erstellen, kann ich einfach Folgendes schreiben:

ni x.js

3 Zeichen schneller als berühren!

Jacob E. Dawson
quelle
Dies ist nicht idempotentni : The file 'x.js' already exists
Steven Penny
8

Ich stellte verschiedene Quellen zusammen und schloss 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
John Saunders
quelle
1
+1 für die leistungsstärkste Art, LastWriteTime für eine Datei zu ändern (was ich auch brauchte), obwohl sich die Frage auf die neue Funktion zur Dateierstellung des Befehls touch konzentrierte.
Nathan Hartley
Ohne eine Variable zu verwenden?
riahc3
5

Öffnen Sie Ihre Profildatei:

notepad $profile

Fügen Sie die folgende Zeile hinzu:

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

Speichern Sie es und laden Sie Ihr $ -Profil erneut, um es sofort zu verwenden. (Keine Notwendigkeit, Powershell zu schließen und zu öffnen)

. $profile

So fügen Sie eine neue Datei in das aktuelle Verzeichnis ein:

touch testfile.txt

So fügen Sie eine neue Datei in das Verzeichnis "myfolder" ein:

touch myfolder\testfile.txt

Wenn bereits eine Datei mit demselben Namen vorhanden ist, wird diese nicht überschrieben. Stattdessen erhalten Sie eine Fehlermeldung.

Ich hoffe, es hilft

Bonus-Tipp:

Sie können das Äquivalent von 'mkdir' erstellen, indem Sie die folgende Zeile hinzufügen:

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

Gleiche Verwendung:

mkdir testfolder
mkdir testfolder\testsubfolder
RafaelGP
quelle
5
ac file.txt $null

Der Dateiinhalt wird nicht gelöscht, aber das Datum wird auch nicht aktualisiert.

8DH
quelle
5

Es sieht so aus, als würden einige Antworten hier nicht die Dateicodierung berücksichtigen.

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

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 ​​Grund auch immer fc > $fileund fc >> $file, scheinen auch UTF-8-Dateien zu produzieren.

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) Codierungen, die Out-File unterstützt, sind: [[-Encoding] {unknown | Zeichenfolge | Unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Sie können auch Pipes an Out-File senden, um der Datei einige zu speichernde Textdaten sowie ein -append-Flag zuzuweisen. Zum Beispiel:

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

In diesem Beispiel wird der Zeitstempel aus irgendeinem Grund nicht aktualisiert, in diesem Beispiel jedoch:

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, über welche Codierung Sie verfügen, hat VS-Code eine nützliche Funktion, in der in der unteren rechten Ecke angegeben ist, wie die Codierung lautet. Ich denke, Notepad ++ hat auch eine ähnliche Funktion.

Garret Hoffman
quelle
Set-Content -Path $file -value $nullerledigt den Job und es hat keinen Einfluss auf die Dateicodierung. Überprüfen Sie auch die ss64-Version vontouch .
Anton Krouglov
3

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

PS> sc example.txt $null

Die andere gebräuchliche Verwendung touchist jedoch das Aktualisieren des Zeitstempels der Datei. Wenn Sie versuchen, mein scBeispiel auf diese Weise zu verwenden, wird der Inhalt der Datei gelöscht.

Jay Bazuzi
quelle
1
Vielen Dank! Was scbedeutet Bearbeiten: herausgefunden ("Set Content")
jsalonen
2

Um eine leere Datei in Windows zu erstellen, gehen Sie wie folgt vor:

fsutil file createnew file.name 0

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

Jon Carlstedt
quelle
2

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 nicht die andere Funktion von Unix aus touch, nämlich das Aktualisieren des Zeitstempels, wenn der Dateiname bereits vorhanden ist. Die Frage impliziert jedoch, dass der Benutzer nur eine Datei mit der Größe Null interaktiv erstellen möchte, ohne auf Notepad zurückzugreifen.

ghostarbeiter
quelle
1

Ich habe den Namen "Write-File" verwendet, weil "Touch" kein zugelassenes PowerShell-Verb ist . Ich alias es dennoch als Berührung.

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

Verwendungszweck:

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

Unterstützt:

  • Pfade in anderen Verzeichnissen
  • Credential für Netzwerkpfade
  • Verbose, DebugUnd WhatIfFahnen
  • Platzhalter (nur Zeitstempel-Aktualisierung)
Error
quelle
Der New-ItemBefehl wurde in vier vorherigen Antworten angeboten. Sie haben einen Wrapper mit 20 Zeilen bereitgestellt. Können Sie etwas klarer erklären, welchen Vorteil Ihre Lösung gegenüber den früheren hat? Zum Beispiel, was sind diese Verbose, Debugund WhatIfFahnen, etc?
Scott
Ein wichtiger Unterschied zwischen dieser Antwort und der New-ItemAktualisierung des Zeitstempels vorhandener Dateien.
Jpaugh