Windows-Äquivalent des Linux-Befehls 'touch'?

232262
facepalmd

Was verwenden Sie, wenn Sie das Datumsänderungsfeld einer Datei unter Windows aktualisieren möchten?

  1. Befehle, auf die über C ++, .NET, C # oder etwas Windows-eigenes System (vorzugsweise Vista) zugegriffen werden kann
  2. Werkzeuge / Anwendungen vorzugsweise frei und wenn möglich auch Open Source

Bearbeiten: Es gibt bereits eine Seite für Anwendungen, wie von CheapScotsman hier angegeben .

Wenn jemand weiß, wie ich dies über C ++, C #, WSH oder ähnliches tun kann, gut und gut, sonst würde ich denken, dass alles andere in der verknüpften Frage behandelt wird.

153
http://stackoverflow.com/questions/210201/how-to-create-empty-text-file-from-a-batch-file erwähnt eine Last, einschließlich `REM.> a` barlop vor 9 Jahren 0
Die vier oben genannten Alternativen sowie vier weitere, die hier nicht erwähnt werden, finden Sie in der Antwort auf eine ähnliche Frage: ["Windows Recursive Touch Command"] (http://superuser.com/questions/251470/windows-recursive-touch -Befehl / 251507 # 251507 "Windows rekursiver Berührungsbefehl") JdeBP vor 13 Jahren 0

30 Antworten auf die Frage

335
EM0

Wenn Sie den Datumsstempel einer Datei mit Windows berühren möchten, verwenden Sie den folgenden Befehl an der Eingabeaufforderung:

copy /b filename.ext +,, 

(wo filename.extist der Dateiname). Das +,,ist eine spezielle copyMarkierung, um das Datum / die Uhrzeit in der Datei zu aktualisieren :

* Ändern von Uhrzeit und Datum einer Datei

Wenn Sie einer Datei die aktuelle Uhrzeit und das aktuelle Datum zuweisen möchten, ohne die Datei zu ändern, verwenden Sie die folgende Syntax:

copy /b Source+,,

Die Kommas geben an, dass der Parameter Destination nicht vorhanden ist.

Bearbeiten basierend auf Kommentaren von Lumi und Justin: Legen Sie diese in eine Batch-Datei, z. touch.cmd

@COPY /B %1+,, %1 

Dies funktioniert auch, wenn sich die Datei nicht im aktuellen Verzeichnis befindet (getestet unter Windows 7).

Dies ist langsam, wenn die Dateien groß sind. mob vor 15 Jahren 4
Was macht das? Wo ist es dokumentiert? (Google indexiert "+ ,," nicht, und die MS-Website führt mich nicht in die richtige Richtung, da die Suche nach "Kopie" eine Menge nützlicher Informationen darstellt.) Ich meine, es funktioniert gut und ich nehme das an viel für selbstverständlich, aber ich bin neugierig. dash-tom-bang vor 15 Jahren 44
Dokumentation für `copy`: http://technet.microsoft.com/en-us/library/bb490886.aspx Joseph Hansen vor 13 Jahren 17
`type touch.bat` ist` @echo off` und die nächste Zeile `copy / b% 1 + ,,` - setze es in `C: \ bin` oder was hast du für deine eigenen Skripte, und dann kannst du es verwenden wie "touch myfile.txt". Lumi vor 13 Jahren 14
In Win7 funktioniert dies nicht, wenn Sie sich nicht in dem Ordner befinden, in dem sich die Datei befindet. Es wird eine Kopie im aktuellen Arbeitsverzeichnis erstellt. vor 12 Jahren 17
@ Jamie ja, ich habe auch dieses Problem. netawater vor 11 Jahren 0
@mob Beachten Sie, dass dies bei einer großen Datei nicht langsam war. Ich habe es in einer> 1 GB-Datei auf einem Netzlaufwerk verwendet, und es wurde sofort zurückgegeben (und arbeitete). Chadwick vor 11 Jahren 4
@ Jamie: Nicht mit Win7 verwandt, gilt für alle Betriebssysteme. Sie müssen sich im aktuellen Verzeichnis befinden, da die gleiche Datei ohne Pfadinformationen verwendet wird (siehe Technet-Link aus josmh-Kommentar). Mat M vor 11 Jahren 0
@Gish Domains: Möchten Sie Ihre Antwort als Community-Wiki veröffentlichen? Ich finde es sehr hilfreich, wenn auch nicht als Antwort markiert. Mat M vor 11 Jahren 0
Ich habe ein [GIST] erstellt (https://gist.github.com/tjbarbour/6356774), das diese Antwort mit [dieser Antwort] kombiniert (http://stackoverflow.com/questions/659647/how-to-get-folder- path-from-file-path-with-cmd), um das Zielverzeichnis automatisch zu verschieben TJB vor 11 Jahren 2
@TJB-Stapeldateien könnten mit @Echo OFF beginnen drzaus vor 10 Jahren 1
Wenn Sie dies in einem Remote-Ordner (UNC-Pfad) tun müssen, müssen Sie auch das Ziel für den Kopierbefehl angeben - `copy / b Source + ,, Source` -, wobei` Source` den vollständigen Pfad zur Datei enthält Justin vor 10 Jahren 5
`+ ,,`: http://blogs.msdn.com/b/oldnewthing/archive/2013/07/10/10432879.aspx thirtydot vor 10 Jahren 4
"Dies ist langsam, wenn die Dateien groß sind." Eigentlich ist es nicht langsam, es dauert weniger als eine Sekunde, und die HD-Zugriffs-LED leuchtet gar nicht. Der "copy" -Befehl in Windows hat eindeutig den "touch" -Befehl, der im Technet-Artikel speziell codiert ist. +1 Große Entdeckung; Ich habe es nie gewusst. Synetech vor 9 Jahren 1
Ein kleines winziges kleines Problem: Alle Dateien werden kopiert. es platziert sie in CWD. Violet Giraffe vor 7 Jahren 0
Windows XP mag es nicht, die Datei von außerhalb von CWD über sich selbst zu kopieren. Verwenden Sie dazu `pushd"% ~ dp1% "` vor dem CWD "touch" und danach "popd". (Für den Fall, dass Sie einen der Millionen verbleibender XP-Maschinen unterstützen ...) Tydaeus vor 7 Jahren 0
160
Greg Hewgill

Ich habe Unxutils verwendet und empfehle, es sind native Win32-Ports vieler Unix-Dienstprogramme. Dort ist ein touchBefehl.

Wie bei fast jedem Unix-zu-Windows-Port funktioniert dieser Vorgang nicht mit Unicode-Zeichen in den Dateinamen außerhalb des Kodierungssatzes als Standard für Nicht-Unicode-Programme. Testen Sie den Dateinamen, der jedes dieser Tools auslöst: `" test тεст τεστ.txt "` RomanSt vor 10 Jahren 1
gnuwin32 hat es. In der Tat scheitert auch gnuwin32 für Unicode-Zeichen. barlop vor 8 Jahren 0
Update von 2017 In Windows 10 können wir das Linux-Subsystem für Windows verwenden, das bash installiert. Keine Notwendigkeit für cygwin, MinGW, Unxutils oder andere partielle Unix-Verbindungen zu Windows-Ports. https://docs.microsoft.com/en-us/windows/wsl/install-win10 Davos vor 6 Jahren 0
92
ThiagoAlves

Wenn Sie nur das letzte Änderungsdatum der Datei ändern möchten (was in meinem Fall der Fall war):

C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date 
PowerShell FTW. Ich meine, ernsthaft, Unix ist cool, aber PS ist cooler. matt vor 13 Jahren 8
Sie können den letzten Schreibvorgang auch für mehrere Dateien / Ordner aktualisieren vor 13 Jahren 1
Dies funktioniert nur bei einer Datei. Für mehrere Dateien: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date} Eli Algranti vor 12 Jahren 12
Wenn Sie es rekursiv machen wollen, funktioniert das ziemlich gut: gci -recu -inc "*. *" | % {$ _. LastWriteTime = Get-Date} BrainSlugs83 vor 11 Jahren 2
Nicht sicher, warum, aber die Sternchen erscheinen nicht in meinem obigen Kommentar - das "." sollte doppelte Anführungszeichen, Sternchen, Punkte, Sternchen, doppelte Anführungszeichen sein (wissen Sie, "Stern-Stern".) Jedenfalls versuchte die Hilfe nachzuschlagen, um herauszufinden, warum, aber jetzt ist sie nicht editierbar. Verdammt. BrainSlugs83 vor 11 Jahren 0
@ BrainSlugs83: Backticks `` für den Code verwenden: `gci -recu -inc" *. * "| % {$ _. LastWriteTime = Get-Date} ` alldayremix vor 11 Jahren 6
"touch" stellt die Uhrzeit auf eine bestimmte Zeit ein oder "now", wenn keine angegeben ist. `.LastWriteTime` ist dasselbe, also können Sie so etwas wie` .LastWriteTime = '12 / 30/99 23: 59'` tun. @matt: höchstwahrscheinlich sind Sie mit der * nix-Shell nicht sehr vertraut; PS scheint noch einen langen Weg vor sich zu haben - z. B. "sed"? "grep"? "vi"? : p BEARBEITEN: Warum werden Shift + Enter ignoriert? Wie füge ich neue Zeilen hinzu? void vor 10 Jahren 1
Unix-Touch ist großartig für seine Einfachheit. Willmore vor 8 Jahren 0
52
bobbogo
type nul >>file & copy file +,, 
  • Erstellt, filewenn es nicht existiert.
  • Lässt den Inhalt der Datei alleine.
  • Verwendet nur cmdeingebaute Ins.
  • Sowohl der letzte Zugriff als auch die Erstellungszeiten wurden aktualisiert.

AKTUALISIEREN

Gah! Dies funktioniert nicht für schreibgeschützte Dateien, während dies der touchFall ist. Ich schlage vor:

:touch if not exist "%~1" type nul >>"%~1"& goto :eof set _ATTRIBUTES=%~a1 if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1" 
Es ist schade, dass copy das Attribut + r nicht so ignorieren kann, wie dies bei xcopy der Fall ist. Oder es ist schade, dass xcopy die komische `filename + ,,` - Syntax nicht unterstützt. Abel vor 12 Jahren 0
Leider funktioniert das nicht (zumindest nicht in Windows 7). Es scheint, dass der Befehlsinterpreter den Zeitstempel des Ziels einer Umleitung nicht aktualisiert, wenn die Datei nicht tatsächlich geändert wird (dh es gibt keine Daten zum Umleiten). Synetech vor 9 Jahren 0
32
Faredoon

@ Dash-Tom-Bang:

Hier erklärt Technet die mysteriösen '+' und Kommas:

Kopie / b Quelle + ,,

Die Kommas geben an, dass der Parameter Destination nicht vorhanden ist.

Der Befehl copy unterstützt das Zusammenführen mehrerer Dateien in einer einzigen Zieldatei. Da an der Eingabeaufforderung kein leeres Ziel mit einem Leerzeichen angegeben werden kann, können zwei Kommas verwendet werden, um dies anzugeben.

Dies ist die Kopierbefehlsreferenz von Technet: http://technet.microsoft.com/de-de/library/bb490886.aspx

Jetzt ist die Syntax einfach durcheinander. Ernsthaft, * was haben sie gedacht? * Beachten Sie auch die gleiche Dokumentation: "Destination: Required" ... Ich bin erstaunt. sth vor 14 Jahren 16
Das scheint nicht mal in Vista zu funktionieren ... Ich frage mich, ob sie zur Besinnung kamen? quillbreaker vor 14 Jahren 1
Funktioniert in Windows 7 Imran vor 13 Jahren 1
Es hat auch ohne Kommas für mich funktioniert: copy file.ext + Die Dokumentation ist also so weit wie möglich vom tatsächlichen Verhalten entfernt, da das Verhalten von vernünftigen Erwartungen abhängt. Abgan vor 13 Jahren 5
Es funktionierte in Windows Server 2008 jedoch nur, wenn Sie sich in dem Ordner befinden, der die Datei enthält FrinkTheBrave vor 12 Jahren 2
22
Fredrik Mörk

Wenn Sie es wie Codierung selbst fühlen, bietet .NET die File.SetLastAccessTime, File.SetCreationTimeund File.SetLastWriteTimeMethoden.

21
roger

Hier ist eine rekursive Version mit Powershell ... Dies ändert den Zeitpunkt der letzten Änderung für alle Dateien und Unterverzeichnisse sowie die Dateien in den Unterverzeichnissen dieses Verzeichnisses

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date} 
Weniger wortreich, aber nur mit Standard-Powershell-Kürzeln: `ls * -recurse | % {$ _. LastWriteTime = Get-Date} ` Jonas vor 7 Jahren 2
15
pkm

Ich habe versucht, eine leere Datei in meinem Batch-Skript zu erstellen. Sie können dies verwenden:

ECHO text>file1.txt 
Dies ist mit Abstand die beste schnelle Methode. Ich brauchte nur eine .gitignore-Datei zu erstellen, und Windows 7 beschwert sich immer, dass "ein Dateiname eingegeben werden muss" usw. "echo pie> .gitignore" hat ein Vergnügen - danke! vor 10 Jahren 3
@Alex Dies ist nicht verwandt, aber der Windows-Fehler liegt daran, dass die Datei mit einem Punkt beginnt. In Windows Explorer gibt es einen merkwürdigen Hacker, mit dem man umgehen kann: Die Datei sollte auch mit einem Punkt enden. Geben Sie `.gitignore.` ein und wenn Sie die Eingabetaste drücken, wird der nachfolgende Zeitraum entfernt. Verrückt, aber es funktioniert. Brad Cupit vor 9 Jahren 4
Ich wünschte, ich könnte das genug Upvotes geben, damit die großen Spieler an Popularität gewinnen. Jonathan Mee vor 8 Jahren 1
Dadurch wird zwar keine leere Datei erstellt, file1.txt enthält jedoch "Text". Joshua Meyers vor 7 Jahren 1
14
Dave Webb

Das GnuWin32- Projekt verfügt über Windows-Ports der Gnu-Versionen der Unix-Befehlszeilenprogramme.

Es gibt eine Reihe von separaten Paketen und Sie können nur die Befehle installieren, die Sie benötigen, ohne andere Abhängigkeiten. Dafür touchbenötigen Sie das CoreUtils- Paket.

13
Jon Galloway

Hier ist ein einfaches Regfile, das ich geschrieben habe, um einen Rechtsklick im Windows-Explorer hinzuzufügen . Es wäre auch leicht, ein Skript zu schreiben, da es einfach nur folgendes aufruft:

cmd.exe /c copy %1+nul %1 /by 
Und vergessen Sie nicht `copy nul some_file`, um eine leere Datei zu erstellen (was ich sehe, dass` touch` am häufigsten verwendet wird). Joey vor 15 Jahren 0
Ack! Zip-Datei nicht erreichbar (etwas über brinkster22.com muss die verweisende Seite sein). Jon, kannst du das aktualisieren? Dan7119 vor 13 Jahren 0
Funktioniert unter Win7. Funktioniert nicht unter WinXP: Die Dateizeit bleibt nach dem Ausführen von "Kopieren" gleich. Egor Skriptunoff vor 8 Jahren 0