Entspricht Linux 'Touch', um eine leere Datei mit PowerShell zu erstellen? [doppelt]

Diese Frage hat hier bereits Antworten: Windows-Äquivalent des Linux-Befehls 'touch'? (31 Antworten) Geschlossen vor 3 Jahren.

Gibt es in PowerShell 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 umständlich - normalerweise öffne ich einfach eine neue Instanz von Notepad und speichere eine leere Datei.

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

Ich möchte das Berührungsverhalten nicht genau abgleichen, sondern nur das einfachste mögliche Äquivalent finden zum Erstellen leerer Dateien.

Author: jsalonen, 2012-11-07

14 answers

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

echo $null >> filename
 201
Author: Yash Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-09-22 19:15:14

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
 143
Author: dangph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-09-30 06:18:23

Hier ist eine Version, die eine neue Datei erstellt, wenn sie nicht vorhanden ist, oder den Zeitstempel aktualisiert, wenn sie 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
    }
}
 88
Author: LittleBoyLost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-03-25 12:47:36

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

 27
Author: Ƭᴇcʜιᴇ007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-11-07 19:32:59

Ich bevorzuge Format-Table für diese Aufgabe (mnemonic file touch):

ft > filename

Um mit nicht leeren Dateien zu arbeiten, können Sie Folgendes verwenden:

ft >> filename

Ich habe dies gewählt, weil es ein kurzer Befehl ist, der in diesem Zusammenhang nichts tut, a noop. Es ist auch schön, weil, wenn Sie die Umleitung vergessen:

ft filename

Anstatt dir einen Fehler zu geben, macht es einfach nichts. Einige andere Aliase das wird funktionieren sind Format-Custom (fc) und Formatweit (fw).

 22
Author: Steven Penny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-18 03:02:01

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 implizit ist, wenn eine Erweiterung hinzugefügt wird), sodass ich einfach schreiben kann, um eine Javascript-Datei mit dem Namen 'x' in meinem aktuellen Verzeichnis zu erstellen:

ni x.js

3 Zeichen schneller als Touch!

 16
Author: Jacob E. Dawson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-06-15 16:45:40

Ich habe verschiedene Quellen zusammengestellt und Folgendes gefunden, das meinen Bedürfnissen entsprach. 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
 9
Author: John Saunders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-02-25 15:52:02

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

Ich bin gerade 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 irgendeinem Grund scheinen fc > $file und fc >> $file 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) Codierungen, die Out-File unterstützt, sind: [[-Encoding] {unknown | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | Standard | Soem/}]. Sie können auch Sachen zu Out-File, um der Datei einige Textdaten zum Speichern zu geben, und auch ein-append Flag. 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:

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, die ich gefunden habe VS-Code hat eine raffinierte Funktion, bei der in der unteren rechten Ecke steht, was die Codierung ist. Ich denke, Notepad++ hat auch eine ähnliche Funktion.

 7
Author: Garret Hoffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-08 23:30:09
ac file.txt $null

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

 6
Author: 8DH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-08-12 12:52:52

Ö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 $profile neu, um es sofort zu verwenden. (Keine Notwendigkeit, Powershell zu schließen und zu öffnen)

. $profile

Um eine neue Datei im aktuellen Verzeichnistyp hinzuzufügen:

touch testfile.txt

Um eine neue Datei in 'myfolder' Verzeichnistyp hinzuzufügen:

touch myfolder\testfile.txt

Wenn eine Datei mit demselben Namen bereits vorhanden ist, wird sie nicht überschrieben. Stattdessen erhalten Sie einen Fehler.

Ich hoffe, es hilft

Bonus Spitze:

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
 5
Author: RafaelGP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-03-08 12:47:19

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

PS> sc example.txt $null

Die andere häufige Verwendung von touch besteht jedoch darin, den Zeitstempel der Datei zu aktualisieren. Wenn Sie versuchen, mein sc Beispiel auf diese Weise zu verwenden, wird der Inhalt der Datei gelöscht.

 3
Author: Jay Bazuzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-02-25 22:19:10

Ich habe den Namen "Write-File" verwendet, weil "Touch" kein genehmigtes PowerShell-Verb ist. Ich benenne es jedoch immer noch als Touch.

Berühren.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

Usage:

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

Unterstützt:

  • Pfade in anderen Verzeichnissen
  • Credential für Netzwerkpfade
  • Verbose, Debug, und WhatIf flags
  • Platzhalter (nur Aktualisierung des Zeitstempels)
 3
Author: error,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-23 01:32:35

Um eine leere Datei in Windows zu erstellen, ist der Fastenweg der folgende:

fsutil file createnew file.name 0

Die Null ist Dateigröße in Bytes, daher ist dies auch nützlich, um große Dateien zu erstellen (sie sind zum Testen der Komprimierung nicht nützlich, da sie keine tatsächlichen Daten enthalten und auf so ziemlich nichts komprimiert werden)

 2
Author: Jon Carlstedt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-11-02 14:58:44

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 touch aus, nämlich den Zeitstempel zu aktualisieren, wenn Dateiname bereits vorhanden ist, aber die Frage impliziert, dass der Benutzer nur eine Datei mit der Größe Null erstellen möchte interaktiv ohne auf Notepad zurückzugreifen.

 2
Author: ghostarbeiter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-05-06 06:36:24