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


Was verwenden Sie, wenn Sie das Datumsfeld einer Datei unter Windows aktualisieren möchten?

  1. Befehle zugänglich über C ++, .NET, C # oder etwas, das nativ für Windows ist (vorzugsweise Vista)
  2. Werkzeuge / Anwendungen vorzugsweise frei und wenn möglich auch Open Source

Bearbeiten:  Es gibt bereits eine Seite für Anwendungen, auf die CheapScotsman hingewiesen hat Hier.

Wenn jemand weiß, wie ich das über C ++, C #, WSH oder etwas Ähnliches, gut und gut, sonst würde ich denken, dass alles andere in der verbundenen Frage abgedeckt ist.


151
2018-05-29 00:45


Ursprung


Die vier oben genannten Alternativen sowie vier weitere, die hier nicht erwähnt werden, finden sich in der Antwort auf eine ähnliche Frage: "Windows rekursiver Touch-Befehl" - JdeBP
stackoverflow.com/questions/210201/ ...    erwähnt eine Last, einschließlich REM.>a - barlop


Antworten:


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

copy /b filename.ext +,,

(woher filename.ext ist der Name Ihrer Datei). Das +,, ist eine spezielle Flagge zu copy sag es einfach Aktualisieren Sie das Datum / die Uhrzeit für die Datei:

* Ändern der Uhrzeit und des Datums 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 Kommata geben an, dass der Parameter Destination nicht angegeben wurde.

Bearbeiten basierend auf Kommentaren von Lumi und Justin: Legen Sie dies 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).


333
2017-09-09 09:13



Was macht das? Wo ist es dokumentiert? (Google versäumt es, "+ ,," zu indizieren, und die MS-Seite führt mich nicht in die richtige Richtung, da die Suche nach "Kopie" sehr nutzlos ist.) Ich meine, es funktioniert großartig und ich nehme das sehr selbstverständlich, aber ich bin neugierig. - dash-tom-bang
Dokumentation für copy: technet.microsoft.com/en-us/library/bb490886.aspx - Joseph Hansen
type touch.bat ist @echo off und nächste Zeile copy /b %1 +,, - leg es rein C:\bin oder was hast du für deine eigenen Skripte, und dann kannst du es gerne benutzen touch myfile.txt. - Lumi
In Win7 wird dies nicht funktionieren, wenn Sie nicht in dem Ordner sind, der die Datei enthält. Es erstellt eine Kopie im aktuellen Arbeitsverzeichnis.
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 - woher Source enthält den vollständigen Pfad zur Datei - Justin


Ich habe es benutzt und empfehle es unxutils Das sind native Win32-Ports vieler gängiger Unix-Utilities. Da ist ein touch Befehl dort drin.


160
2017-09-09 14:18



Wie fast jeder Unix-zu-Windows-Port funktioniert dies nicht mit Unicode-Zeichen in den Dateinamen außerhalb der Codierung, die als Standard für Nicht-Unicode-Programme festgelegt wurde. Testen Sie den Dateinamen, der jedes dieser Tools stolpern wird: "test тест τεστ.txt" - RomanSt
Gnuwin32 hat es. aber in der Tat, gnuwin32 ist auch für Unicode-Zeichen fehlgeschlagen. - barlop
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 zu Windows-Ports. docs.microsoft.com/en-us/windows/wsl/install-win10 - Davos


Wenn Sie nur das letzte Änderungsdatum der Datei ändern wollen (was mein Fall war):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

90
2018-02-16 15:21



PowerShell FTW. Ich meine, ernsthaft, Unix ist cool, aber PS ist cooler. - matt
Sie können das letzte Mal auch für mehrere Dateien / Ordner schreiben
Dies funktioniert nur für eine Datei. Für mehrere Dateien: ls * | ForEach-Objekt {$ _. LastWriteTime = Get-Date} - Eli Algranti
Wenn du es rekursiv machen willst, funktioniert das ziemlich gut: gci -recu -inc "."|% {$ _. LastWriteTime = Abrufdatum} - BrainSlugs83
@ BrainSlugs83: benutze Backticks `für den Code: gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date } - alldayremix


type nul >>file & copy file +,,
  • Erstellt file wenn es nicht existiert.
  • Lässt Dateiinhalte alleine.
  • Benutzt einfach cmd Einbauten.
  • Beide letzter Zugriff und Schaffung mal aktualisiert.

AKTUALISIEREN

Gah! Dies funktioniert nicht für schreibgeschützte Dateien touch tut. 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"

51
2017-11-25 10:51



Es ist schade, dass die Kopie das Attribut + r nicht ignorieren kann, so wie es xcopy tut. Oder, es ist schade, dass xcopy das Seltsame nicht unterstützt filename +,, Syntax. - Abel
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 modifiziert wird (d. H. Es gibt keine Daten zum Umleiten). - Synetech


@ dash-tom-bang:

Hier ist Technets Erklärung des mysteriösen '+' und Kommas:

Kopieren / b Quelle + ,,

Die Kommata weisen auf das Weglassen hin   der Zielparameter

Der Kopierbefehl unterstützt das Zusammenführen mehrerer Dateien in eine einzige Zieldatei. Da ein leeres Ziel nicht mit einem Leerzeichen an der Eingabeaufforderung angegeben werden kann, können zwei Kommas verwendet werden, um dies zu bezeichnen.

Und das ist Technets Kopierbefehlsreferenz: http://technet.microsoft.com/en-us/library/bb490886.aspx


32
2017-07-13 14:54



Jetzt ist das nur eine vermasselte Syntax. Ernst, Was dachten sie? Beachten Sie auch die gleiche Dokumentation sagt "Ziel: Erforderlich." ... Ich bin erstaunt. - sth
Das scheint in Vista nicht einmal zu funktionieren ... Ich frage mich, ob sie zur Besinnung gekommen sind? - quillbreaker
Funktioniert in Windows 7 - Imran
Es funktionierte für mich auch ohne Kommas: copy file.ext + Damit ist die Dokumentation so weit vom tatsächlichen Verhalten entfernt wie das Verhalten von irgendwelchen vernünftigen Erwartungen abweicht. - Abgan
Es funktionierte in Windows Server 2008, aber nur, wenn Sie sich in dem Ordner befinden, der die Datei enthält - FrinkTheBrave


Wenn Sie es selbst programmieren möchten, bietet .NET die File.SetLastAccessTime, File.SetCreationTime und File.SetLastWriteTime Methoden.


22
2017-09-09 09:18





Hier ist eine rekursive Version mit Powershell ... das wird die letzte modifizierte Zeit für alle Dateien und Unterverzeichnisse und Dateien innerhalb der Unterverzeichnisse dieses Verzeichnisses ändern

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}

21
2017-07-10 11:52



Weniger ausführlich, aber nur mit standardmäßigen Powershell-Shorthands: ls * -recurse | % { $_.LastWriteTime = Get-Date } - Jonas


Das GnuWin32 Projekt hat Windows-Ports der Gnu-Versionen der Unix-Befehlszeilenprogramme.

Es kommt als eine Anzahl von separaten Paketen und Sie können nur die Befehle installieren, die Sie benötigen, ohne weitere Abhängigkeiten. Zum touch du würdest das brauchen CoreUtils Paket.


14
2017-09-09 09:17





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

ECHO text>file1.txt

14
2017-09-09 09:13



Dies ist BY FAR die beste schnelle Methode .. Ich musste nur eine .gitignore-Datei erstellen, und Windows 7 beschwert sich "muss einen Dateinamen eingeben" usw. usw. echo pie>.gitignore hat ein Vergnügen gemacht - danke!
@Alex Das ist nicht verwandt, aber dieser Windows-Fehler liegt daran, dass die Datei mit einem Punkt beginnt. Es gibt einen merkwürdigen Hack, der im Windows Explorer herumkommt: Die Datei sollte auch mit einem Punkt enden. Also tippe .gitignore. und wenn Sie die Eingabetaste drücken, entfernt Windows den nachgestellten Zeitraum. Verrückt, aber es funktioniert. - Brad Cupit
Ich wünschte, ich könnte das genug Upvotes geben, dass es die großen Spieler in der Popularität fangen würde. - Jonathan Mee
Dies erzeugt jedoch keine leere Datei, datei1.txt enthält "Text". - Joshua Meyers


cygwin kommt mit touch. Ich weiß, dass du erwähnt hast, dass du kein ganzes Framework installieren willst, aber Cygwin ist ziemlich leicht und kann vom DOS-Befehlsfenster aus aufgerufen werden, ohne dass die ganze unixartige Befehlszeile aktiviert ist.

Sie können auch steuern, welche Tools installiert werden sollen, sodass Sie einfach das installieren können touch.exe Datei, und lassen Sie den Rest des Rahmens.


13
2017-09-09 09:19



Bis zu diesem Punkt müssen Sie lediglich die Dateien touch.exe und cygwin.dll in einem Verzeichnis installieren, um das Tool zu verwenden. Es gibt keine anderen Abhängigkeiten im Vergleich zur Verwendung von Cygwin-basierten Tools. - Tall Jeff
wenn ich das (win7x64) versuche, brauche ich 4 cygwin DLLs zusätzlich zu touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll - matt wilkie


Hier ist ein einfaches Regfile, an das ich geschrieben habe Klicken Sie im Windows Explorer mit der rechten Maustaste auf "Touch". Es wäre auch einfach, es zu skripten, da es nur ruft:

cmd.exe /c copy %1+nul %1 /by

13
2017-12-31 12:39



Und vergiss nicht copy nul some_file um eine leere Datei zu erstellen (was ich sehe touch am häufigsten für verwendet). - Joey
Nein! Zip-Datei nicht zugänglich (etwas über brinkster22.com muss die verweisende Seite sein). Jon, kannst du das aktualisieren? - Dan7119
Funktioniert auf Win7. Funktioniert nicht mit WinXP: Die Dateizeit bleibt nach dem Ausführen von "Kopieren" gleich. - Egor Skriptunoff