Windows-Äquivalent zum Linux-Befehl 'touch'?


175

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

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

Bearbeiten: Es gibt bereits eine Seite für Bewerbungen, auf die CheapScotsman hier hinweist .

Wenn jemand weiß, wie ich das über C ++, C #, WSH oder ähnliches machen kann, dann denke ich, dass alles andere in der verknüpften Frage behandelt wird.


Die vier oben genannten Alternativen sowie vier weitere, hier nicht genannte, finden Sie in der Antwort auf eine ähnliche Frage: "Windows Recursive Touch Command"
JdeBP

stackoverflow.com/questions/210201/… erwähnt eine Ladung, einschließlichREM.>a
barlop

Antworten:


356

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

copy /b filename.ext +,,

(wo filename.extist der Name Ihrer Datei). Dies +,,ist eine besondere Markierung, um copyanzuzeigen, dass das Datum und die Uhrzeit in der Datei einfach aktualisiert werden sollen :

* Ä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 Kommas kennzeichnen das Weglassen des Zielparameters.

Bearbeiten Sie anhand von Kommentaren von Lumi und Justin: Fügen Sie diese in eine Batch-Datei ein, z. touch.cmd

@COPY /B %1+,, %1

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


46
Was macht das Wo ist es dokumentiert? (Google kann "+ ,," nicht indizieren, und die MS-Site führt mich nicht in die richtige Richtung, da die Suche nach "Kopie" eine Menge von nichts Nützlichem ergibt.) Ich meine, es funktioniert großartig, und das nehme ich an sehr selbstverständlich, aber ich bin neugierig.
Dash-Tom-Bang


14
type touch.batist @echo offund nächste Zeile copy /b %1 +,,- setzen Sie es in C:\binoder was haben Sie für Ihre eigenen Skripte, und dann können Sie es wie verwenden touch myfile.txt.
Lumi

17
In Win7 funktioniert dies nicht, wenn Sie sich nicht in dem Ordner befinden, der die Datei enthält. Es wird eine Kopie im aktuellen Arbeitsverzeichnis erstellt.

6
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 Sourceder vollständige Pfad zur Datei angegeben wird
Justin

162

Ich habe Unxutils verwendet und empfohlen, die native Win32-Ports vieler gängiger Unix-Dienstprogramme sind. Da drin ist ein touchBefehl.


6
Wie bei fast allen Unix-zu-Windows-Ports funktioniert dies nicht mit Unicode-Zeichen in den Dateinamen außerhalb des Codierungssatzes als Standard für Nicht-Unicode-Programme. Testen Sie den Dateinamen, der jedes solche Tool "test тест τεστ.txt"
auslöst

gnuwin32 hat es. Aber in der Tat scheitert gnuwin32 auch an Unicode-Zeichen.
Barlop

1
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-Windows-Ports. docs.microsoft.com/de-de/windows/wsl/install-win10
Davos

@Davos hast du das bei einer anderen Datei als deinem (normalerweise nicht privilegierten) Benutzerkontext versucht? Denn technisch gesehen läuft die Userland-Seite von LXSS als nicht privilegierter Benutzer.
0xC0000022L

@ 0xC0000022L nicht sicher, was Sie im Kontext des touchBefehls bedeuten . Es ist wie alles andere in Nix-Umgebungen, Sie können es entweder tun oder Sie können es tun oder Sie können es nicht, weil Sie keine Berechtigungen haben.
Davos

96

Wenn Sie nur das Datum der letzten Änderung der Datei ändern möchten (was bei mir der Fall war):

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

9
PowerShell FTW. Ich meine, im Ernst, Unix ist cool, aber PS ist cooler.
Matt

1
Sie können den letzten Schreibvorgang auch für mehrere Dateien / Ordner

12
Dies funktioniert nur für eine Datei. Für mehrere Dateien: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date}
Eli Algranti

2
Wenn Sie es rekursiv machen wollen, funktioniert das ziemlich gut: gci -recu -inc " . " | % {$ _. LastWriteTime = Get-Date}
BrainSlugs83

6
@ BrainSlugs83: Verwenden Sie Backticks für den Code:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix

58
type nul >>file & copy file +,,
  • Erstellt, filewenn es nicht existiert.
  • Lässt den Dateiinhalt alleine.
  • Verwendet nur cmdeingebaute Funktionen.
  • Sowohl die letzten Zugriffszeiten als auch die Erstellungszeiten wurden aktualisiert.

AKTUALISIEREN

Gah! Dies funktioniert nicht bei schreibgeschützten Dateien, wohingegen dies touchfunktioniert. 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"

Schade, dass copy das Attribut + r nicht so ignorieren kann wie xcopy. Schade nur, dass xcopy die seltsame filename +,,Syntax nicht unterstützt .
Abel

Leider funktioniert dies 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 wurde (dh es sind keine Daten zum Umleiten vorhanden).
Synetech

32

@ Dash-Tom-Bang:

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

copy / b Source + ,,

Die Kommas kennzeichnen das Weglassen des Zielparameters.

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

Und dies ist die Technet-Referenz für Kopierbefehle : http://technet.microsoft.com/en-us/library/bb490886.aspx


16
Nun, das ist nur die Syntax durcheinander. Ernsthaft, was dachten sie? Beachten Sie auch, dass in derselben Dokumentation "Ziel: Erforderlich" steht. Ich bin erstaunt.
25.11.09

1
Dies scheint nicht einmal in Vista zu funktionieren ... Ich frage mich, ob sie zu Sinnen gekommen sind?
Federbrecher

1
Funktioniert unter Windows 7
Imran

5
Es hat auch ohne Komma funktioniert: copy file.ext + Die Dokumentation ist also so weit vom tatsächlichen Verhalten entfernt, wie das Verhalten von vernünftigen Erwartungen abweicht.
Abgan

2
Es funktionierte in Windows Server 2008, aber nur, wenn Sie sich in dem Ordner befinden, der die Datei enthält
FrinkTheBrave


21

Hier ist eine rekursive Version, die Powershell verwendet. Dadurch wird die letzte Änderungszeit für alle Dateien und Unterverzeichnisse sowie für Dateien in den Unterverzeichnissen dieses Verzeichnisses geändert

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

2
Weniger ausführlich, aber dennoch nur mit Standard-Powershell-Abkürzungen:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas

15

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

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


15

cygwinkommt mit touch. Ich weiß, dass Sie erwähnt haben, dass Sie kein ganzes Framework installieren möchten, aber Cygwin ist recht leicht und kann über das DOS-Befehlsfenster aufgerufen werden, ohne dass die gesamte unix-artige Befehlszeile aktiviert ist.

Sie können auch steuern, welche Tools installiert werden sollen, sodass Sie die touch.exeDatei einfach installieren und den Rest des Frameworks beibehalten können.


2
Um das Tool zu verwenden, müssen Sie lediglich die Dateien touch.exe und cygwin.dll in einem Verzeichnis installieren. Es gibt keine weiteren Abhängigkeiten in Bezug auf die Verwendung von Cygwin-basierten Tools.
Tall Jeff

1
Wenn ich dies versuche (win7x64), benötige ich zusätzlich zu touch.exe 4 Cygwin-DLLs: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
matt wilkie

15

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

ECHO text>file1.txt

3
Dies ist bei weitem die beste schnelle Methode. Ich musste nur eine .gitignore-Datei erstellen, und Windows 7 beschwert sich immer wieder über "muss einen Dateinamen eingeben" usw. usw. hat gut echo pie>.gitignorefunktioniert - danke!

4
@Alex Dies hat nichts mit dem Windows-Fehler zu tun, da die Datei mit einem Punkt beginnt. Es gibt einen merkwürdigen Hack, um das im Windows Explorer zu umgehen: Lassen Sie die Datei auch mit einem Punkt enden. Geben .gitignore.Sie also Folgendes ein und drücken Sie die Eingabetaste. Windows entfernt den abschließenden Zeitraum. Verrückt, aber es funktioniert.
Brad Cupit

1
Ich wünschte, ich könnte so viele positive Stimmen abgeben, dass es die großen Spieler an Popularität gewinnen würde.
Jonathan Mee

1
Hierdurch wird jedoch keine leere Datei erstellt. Datei1.txt enthält "Text".
Joshua Meyers

14

Hier ist ein einfaches Regfile, das ich geschrieben habe, um einen Rechtsklick auf "Touch" im Windows Explorer hinzuzufügen . Es wäre auch einfach, ein Skript zu erstellen, da es nur Folgendes aufruft:

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

Und vergessen Sie nicht copy nul some_file, eine leere Datei zu erstellen (wofür ich toucham häufigsten sehe ).
Joey

Ack! Auf die Zip-Datei kann nicht zugegriffen werden (etwas über brinkster22.com muss die verweisende Site sein). Jon, kannst du das aktualisieren?
Dan7119

Funktioniert auf Win7. Funktioniert nicht unter WinXP: Die Dateizeit bleibt nach dem Ausführen von "copy" gleich.
Egor Skriptunoff


11

Versuchen Sie dieses von CodeProject .

  • Keine Notwendigkeit zu installieren.
  • Wenn Sie möchten, können Sie sogar die Quelle ändern.

2
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
Yan Sklyarenko

9

Sie können auch Cygwin installieren, das Ihnen Touch sowie eine Vielzahl anderer * NIX-Befehle bietet.


2
kann ohne cygwin nicht auf Fenstern leben.
Jweede

Und Cygwin ohne Minze ist ziemlich lahm.
Ahe


5

Aus einer ähnlichen Frage zum Stack Overflow.

Zum Aktualisieren von Zeitstempeln (ohne die anderen Funktionen von touch) würde ich gehen mit:

copy /b filename.ext +,,

1
Dies ist eine Wiederholung der Antwort von Gish Domains von 2 Jahren zuvor, ohne die Erklärung.
Fixer1234


4

von der Website:

Funduc Software Touch ist ein kostenloses Dienstprogramm, mit dem Sie die Zeit, das Datum und / oder die Attributstempel für eine oder mehrere Dateien ändern können. Darüber hinaus kann FS Touch eine festgelegte Anzahl von Sekunden zur vorhandenen Dateizeit addieren / subtrahieren. Sie können angeben, welche Datei (en) und / oder Unterverzeichnisse über komplexe Dateimasken geändert werden sollen. Das Programm kann interaktiv oder über die Befehlszeile ausgeführt werden. Neu in Version 7.2 ist ein Befehlszeilenschalter, mit dem der Zeitstempel für die Änderung der Datei +/- der angegebenen Anzahl von Sekunden geändert werden kann.

FS Touch kann unter Windows XP, Vista, Windows 7 und Windows 8 ausgeführt werden.


4

Dieser Inhalt kann in einer Registrierungsdatei gespeichert werden. Dadurch wird ein Kontextmenü mit einem Rechtsklick für alle Dateien mit der Fähigkeit "Touch File" (getestet unter Windows 7) hinzugefügt. Kopieren Sie alle folgenden Zeilen in die Registrierungsdatei. Führen Sie die Datei aus und genehmigen Sie die Frage. Klicken Sie mit der rechten Maustaste auf eine beliebige Datei (oder mehrere Dateien). Die Option "Datei berühren" ist jetzt verfügbar.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\Touch File]

[HKEY_CLASSES_ROOT\*\shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"

3

Wenn Sie Git für ein oder mehrere Projekte verwenden, hat das auf git-bashWindows basierende mingw den touchBefehl. Ich möchte mich bei @ greg-hewgill dafür bedanken, dass ich darauf hingewiesen habe, dass es für Windows keine Hilfsprogramme gibt.


3

in PowerShell versuchen:

ni fileName.txt

NIist ein Alias ​​des Cmdlets " New-Item ".


1
Willkommen bei SuperUser. Danke fürs Schreiben! Können Sie einen Link zu einer Website hinzufügen, die weitere Informationen zum niBefehl enthält, und möglicherweise beschreiben, was der Befehl bewirkt?
hBy2Py

1
Das New-ItemCmdlet kann nicht zum Aktualisieren des Zeitstempels einer vorhandenen Datei verwendet werden.
Twisty Imitator

Der Zeitstempel wird zwar nicht aktualisiert, es wird jedoch eine neue Datei erstellt, wie dies bei touch der Fall ist. +1 von mir.
MikeMurko

2

Speichern Sie Folgendes als touch.bat in Ihrem Ordner% windir% \ system32 oder fügen Sie den Ordner, in dem es gespeichert ist, Ihrer Umgebungsvariablen PATH hinzu:

@echo off
if %1.==. goto end
if not exist %1 goto end
copy /b %1 +,, > nul
echo %1 touched!
:end

Beispielnutzung:

touch *.cpp
touch somefile.c

Referenz: Microsoft KB 69581


Ausgezeichnet! Kein externes Zeug, nur kopieren. Und natürlich brauchen die meisten von uns es als Batch-Streifen :)
Bogdan Gavril MSFT

2

Ich habe einen schnellen Weg gefunden, dies zu tun, wenn Sie vim installiert haben (nicht gut für große Dateien, öffnet die gesamte Datei und schließt sie dann ...)

vim foobar.txt +wq!

Das "+" setzt ein Argument, um die folgenden Befehle auszuführen. "wq!" ist "schreiben, beenden, erzwingen". Dadurch wird die Datei geöffnet, gespeichert und unmittelbar danach geschlossen.


Sinnlos komplex, sperrig und nicht tragbar. -1
MD XF

2

Ich wollte, dass die 'Touch'-Funktion des Klonens / Duplizierens der Datei ursprünglich aus einer anderen Datei stammt und aus einer Batch-Datei verwendet werden kann.

Ziehen Sie die Videodatei per Drag & Drop in die Batch-Datei, FFMPEG wird ausgeführt, und anschließend werden "Erstellungsdatum" und "Änderungsdatum" aus der Eingabedatei in die Ausgabedatei kopiert.

Dies schien zunächst einfach zu sein, bis Sie feststellen, dass Batch-Dateien schlecht mit Unicode-Dateinamen umgehen können, Inline-PowerShell die Dateinamensymbole durcheinander bringt und doppeltes Escape-Zeichen ein Albtraum ist.

Meine Lösung war, den 'Touch'-Teil zu einem separaten PowerShell-Skript zu machen, das ich' CLONE-FILE-DATE.ps1 'nannte und das Folgendes enthält:

param
(
  [Parameter(Mandatory=$true)][string]$SourcePath,
  [Parameter(Mandatory=$true)][string]$TargetPath
)

(GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime

Dann ist hier ein Beispiel für die Verwendung in meiner 'CONVERT.BAT'-Batchdatei:

%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"

CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"

Ich denke, dass die PowerShell lesbar ist, also erkläre ich nur die Batch-Sprache:

% ~ dp0 ist das aktuelle Verzeichnis der Batchdatei.

% ~ 1 ist der Pfad der Datei, die ohne Anführungszeichen auf dem Stapel abgelegt wird.

CHCP 65001> nul setzt Zeichen auf UTF-8 und schluckt die Ausgabe.

-ExecutionPolicy ByPass ermöglicht das Ausführen von PowerShell, ohne dass die globale Richtlinie geändert werden muss. Dadurch wird verhindert, dass Benutzer versehentlich Skripts ausführen .


1

Versuchen

fsutil file createnew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.- und es verhält sich nicht wie touchbei vorhandenen Dateien.
Keith Thompson

1

Die fünf oben genannten Alternativen sowie drei weitere, hier nicht genannte, finden Sie unter SuperUser: "Windows Recursive Touch Command".


2
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
Yan Sklyarenko

1

Dies hat etwas nichts mit der ursprünglichen Frage zu tun, aber ich finde dies unter Windows aufgrund der grafischen Benutzeroberfläche sehr nützlich.

Ich verwende das TouchPro-Dienstprogramm, das eine grafische Benutzeroberfläche bereitstellt (integriert in die Explorer-Shell):

http://www.jddesign.co.uk/products/touchpro/touchpro.htm


1

Wenn Sie den Befehl wirklich zur Verfügung haben möchten touch, können Sie ihn in eine Batch-Datei mit dem Namen touch.bateinfügen und dort ablegen C:\Windows:

TYPE NUL >>%1

Einfach genug.


Diese Methode aktualisiert die geänderte Zeit NICHT auf den folgenden Plattformen: Windows Server 2012 R2, Windows Server 2016, Windows 10
Nate

0

Die Unix-Leute haben das allgemeine Problem der Aktualisierung des Dateidatums einer beliebigen Datei mit dem Befehl touch behoben . Unter Windows ist jedoch in bestimmten Fällen manchmal eine einfachere Methode möglich.

Ich muss den Zeitstempel einer Anwendungsverknüpfung in Windows 8.1 aktualisieren, um Änderungen an der Hintergrundfarbe der Anwendungskachel sichtbar zu machen, siehe diese SO-Frage . Anstatt eines der oben genannten cleveren Tools zu implementieren, finde ich es einfacher, das Kommentarfeld der Verknüpfung zu bearbeiten. Die meisten Leute lassen dies leer, aber natürlich ist ein nützlicher Kommentar schnell erfunden. Und wenn ein Kommentar vorhanden ist, kann das Hinzufügen oder Entfernen eines letzten Punkts niemals schaden.


0

Ich weiß, dass dies eine alte Frage ist, ich habe gerade eine Berührung auf meinem Windows 10-System entdeckt. Ich habe Git von hier heruntergeladen und installiert (glaube ich) und es sieht so aus, als ob Touch und verschiedene andere Dienstprogramme im Ordner bin sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.