Odpowiednik systemu Windows „dotyk” w systemie Windows?

175

Czego używasz, gdy chcesz zaktualizować pole pliku z modyfikacją daty w systemie Windows?

  1. polecenia dostępne przez C ++, .NET, C # lub coś natywnego dla Windows (najlepiej Vista)
  2. narzędzia / aplikacje najlepiej bezpłatne, a jeśli to możliwe, również oprogramowanie typu open source

Edycja: istnieje już strona dla aplikacji, jak wskazał tutaj CheapScotsman .

Jeśli ktoś wie, jak to zrobić za pomocą C ++, C #, WSH lub czegoś podobnego, dobrze i dobrze, inaczej pomyślałbym, że wszystko inne jest zawarte w powiązanym pytaniu.

facepalmd
źródło
Cztery wyżej wspomniane alternatywy oraz cztery inne niewymienione tutaj można znaleźć w odpowiedzi na podobne pytanie: „Windows Recursive Touch Command”
JdeBP
stackoverflow.com/questions/210201/… wspomina o obciążeniu, w tymREM.>a
barlop

Odpowiedzi:

356

Jeśli chcesz dotknąć datownika pliku za pomocą systemu Windows, użyj następującego polecenia w wierszu polecenia:

copy /b filename.ext +,,

(gdzie filename.extjest nazwa pliku). +,,Jest specjalnym flagę copyinformując go po prostu zaktualizować data / czas na pliku :

* Zmiana godziny i daty pliku

Jeśli chcesz przypisać bieżącą godzinę i datę do pliku bez modyfikowania pliku, użyj następującej składni:

copy /b Source+,,

Przecinki oznaczają pominięcie parametru docelowego.

Edytuj na podstawie komentarzy Lumi i Justina: umieść to w pliku wsadowym, np. touch.cmd

@COPY /B %1+,, %1

Działa to nawet wtedy, gdy pliku nie ma w bieżącym katalogu (testowane w systemie Windows 7).

EM0
źródło
46
Co to robi Gdzie to jest udokumentowane? (Google nie indeksuje „+ ,,”, a witryna MS nie prowadzi mnie we właściwym kierunku, ponieważ wyszukiwanie w „kopiowaniu” okazuje się bardzo przydatne.) To znaczy, działa świetnie i wezmę to wiele za pewnik, ale jestem ciekawy.
dash-tom-bang
19
Dokumentacja dla copy: technet.microsoft.com/en-us/library/bb490886.aspx
Joseph Hansen
14
type touch.batjest @echo offi następny wiersz copy /b %1 +,,- włóż to C:\binlub co masz na własne skrypty, a następnie możesz go użyć jak touch myfile.txt.
Lumi
17
W Win7 to nie zadziała, jeśli nie ma Cię w folderze zawierającym plik. Utworzy kopię w bieżącym katalogu roboczym.
6
Jeśli musisz to zrobić w zdalnym folderze (ścieżka UNC) - musisz również określić miejsce docelowe polecenia kopiowania - copy /b Source+,, Source- gdzie Sourcezawiera pełną ścieżkę do pliku
Justin
162

Użyłem i polecam unxutils, które są rodzimymi portami Win32 wielu popularnych narzędzi Uniksa. Tam jest touchpolecenie.

Greg Hewgill
źródło
5
Jak prawie każdy port Unix-Windows, nie działa to ze znakami Unicode w nazwach plików poza zestawem kodowania jako domyślnym dla programów nie-Unicode. Testowa nazwa pliku, która uruchomi każde takie narzędzie:"test тест τεστ.txt"
RomanSt
gnuwin32 ma to. ale w rzeczywistości gnuwin32 również nie działa na znaki Unicode.
barlop
1
Aktualizacja z 2017 roku W systemie Windows 10 możemy używać podsystemu Linux dla systemu Windows, który instaluje bash. Nie ma potrzeby używania cygwina, MinGW, unxutils ani innych częściowych unixów w portach Windows. docs.microsoft.com/en-us/windows/wsl/install-win10
Davos
@Davos próbowałeś tego w jakimkolwiek pliku innym niż (zwykle nieuprzywilejowany) kontekst użytkownika? Ponieważ technicznie strona użytkownika LXSS działa jako użytkownik nieuprzywilejowany.
0xC0000022L
@ 0xC0000022L nie jestem pewien, co masz na myśli w kontekście touchpolecenia. Podobnie jak wszystko inne w środowiskach nix, możesz to zrobić albo sudo, albo nie możesz, bo nie masz uprawnień.
Davos,
96

Jeśli wszystko, czego chcesz, to zmienić datę ostatniej modyfikacji pliku (tak było w moim przypadku):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
ThiagoAlves
źródło
9
PowerShell FTW. Mówiąc poważnie, unix jest fajny, ale PS jest fajniejszy.
mat
1
Możesz również zaktualizować ostatni zapis dla wielu plików / folderów
12
Działa to tylko w jednym pliku. W przypadku wielu plików: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date}
Eli Algranti
2
Jeśli chcesz to zrobić rekurencyjnie, działa to całkiem dobrze: gci -recu -inc " . " | % {$ _. LastWriteTime = Get-Date}
BrainSlugs83 15.01.2013
6
@ BrainSlugs83: użyj backticks `dla kodu:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix
58
type nul >>file & copy file +,,
  • Tworzy, filejeśli nie istnieje.
  • Pozostawia zawartość pliku w spokoju.
  • Po prostu wykorzystuje cmdwbudowane.
  • Zarówno w ostatniej dostępu i tworzenia razy aktualizowany.

AKTUALIZACJA

Gah! To nie działa na plikach tylko do odczytu, podczas gdy touchdziała. Sugeruję:

: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"
bobbogo
źródło
Szkoda, że ​​kopiowanie nie może zignorować atrybutu + r, tak jak robi to xcopy. Lub szkoda, że ​​xcopy nie obsługuje dziwnej filename +,,składni.
Abel
Niestety to nie działa (przynajmniej nie w Windows 7). Wygląda na to, że interpreter poleceń nie aktualizuje znacznika czasu miejsca docelowego przekierowania, jeśli plik nie jest faktycznie zmodyfikowany (tzn. Nie ma danych do przekierowania).
Synetech
32

@ dash-tom-bang:

Oto wyjaśnienie Technet dotyczące tajemniczego „+” i przecinków:

Kopiuj / b Źródło + ,,

Przecinki oznaczają pominięcie parametru docelowego.

Polecenie kopiowania obsługuje scalanie wielu plików w jeden plik docelowy. Ponieważ nie można określić pustego miejsca docelowego za pomocą znaku spacji w wierszu polecenia, można do tego użyć dwóch przecinków.

I to jest odwołanie do polecenia kopiowania Technet: http://technet.microsoft.com/en-us/library/bb490886.aspx

Faredoon
źródło
16
Teraz to tylko pomieszana składnia. Poważnie, co oni sobie myśleli? Pamiętaj też, że ta sama dokumentacja mówi „Miejsce docelowe: wymagane.” ... Jestem zdumiony.
sth
1
Wydaje się, że to nawet nie działa w Vistę ... Zastanawiam się, czy doszli do rozsądku?
quillbreaker
1
Działa w systemie Windows 7
Imran
5
Działa dla mnie nawet bez przecinków: kopiuj plik.ext + Tak więc dokumentacja jest tak samo daleka od faktycznego zachowania, jak zachowanie od jakichkolwiek uzasadnionych oczekiwań.
Abgan
2
Działa w systemie Windows Server 2008, ale tylko jeśli znajdujesz się w folderze zawierającym plik
FrinkTheBrave
21

tutaj jest wersja rekurencyjna używająca programu PowerShell ... zmieni to czas ostatniej modyfikacji wszystkich plików i podkatalogów oraz plików w podkatalogach tego katalogu

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}
zrozumiałem
źródło
2
Mniej gadatliwy, ale używając tylko standardowych skrótów PowerShell:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas,
15

Projekt GnuWin32 ma porty Windows wersji Gnu narzędzi wiersza poleceń Unix.

Występuje jako szereg oddzielnych pakietów i można zainstalować tylko potrzebne polecenia bez żadnych innych zależności. Do touchtego potrzebny byłby pakiet CoreUtils .

Dave Webb
źródło
15

cygwinwyposażony touch. Wiem, że wspomniałeś, że nie chcesz instalować całego frameworka, ale cygwin jest dość lekki i można go wywoływać z okna poleceń dos bez włączonego całego wiersza poleceń podobnego do Uniksa.

Możesz także kontrolować, które narzędzia zainstalować, aby po prostu zainstalować touch.exeplik i pozostawić resztę frameworka.

serg10
źródło
2
Chodzi o to, że wystarczy zainstalować plik touch.exe i plik cygwin.dll w katalogu, aby móc korzystać z narzędzia. Nie ma innych zależności związanych z używaniem narzędzi opartych na cygwinie.
Wysoki Jeff,
1
gdy próbuję tego (win7x64) potrzebuję 4 cygwin dll oprócz touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
matt wilkie
15

Próbowałem tego, aby utworzyć pusty plik w skrypcie wsadowym. Możesz użyć tego:

ECHO text>file1.txt
pkm
źródło
3
Jest to zdecydowanie najlepsza szybka metoda. Po prostu potrzebowałem utworzyć plik .gitignore, a Windows 7 narzeka „trzeba wpisać nazwę pliku” itd. Itd., echo pie>.gitignoreDziałało - dzięki!
4
@Alex To nie jest związane, ale ten błąd systemu Windows wynika z tego, że plik zaczyna się kropką. W Eksploratorze Windows można obejść ten dziwny hack: koniec pliku również kropką. Wpisz więc, .gitignore.a po naciśnięciu klawisza Enter system Windows usunie końcowy okres. Szalony, ale działa.
Brad Cupit,
1
Żałuję, że nie mogę wyrazić wystarczającej liczby głosów, aby przyciągnąć uwagę dużych graczy.
Jonathan Mee,
1
Nie tworzy to jednak pustego pliku, plik1.txt zawiera „tekst”.
Joshua Meyers
14

Oto prosty plik reguł, który napisałem, aby dodać prawym przyciskiem myszy „dotyk” w Eksploratorze Windows . Łatwo też go napisać, ponieważ wywołuje on po prostu:

cmd.exe /c copy %1+nul %1 /by
Jon Galloway
źródło
I nie zapomnij copy nul some_fileo utworzeniu pustego pliku (do czego touchnajczęściej używam ).
Joey
Ack! Plik zip niedostępny (coś o brinkster22.com musi być stroną polecającą). Jon, możesz to zaktualizować?
Dan7119,
Działa na Win7. Nie działa w WinXP: czas pliku pozostaje taki sam po wykonaniu „kopiowania”.
Egor Skriptunoff,
11

Wypróbuj ten z CodeProject .

  • Nie trzeba instalować.
  • Jeśli chcesz, możesz nawet zmodyfikować źródło.
Prakash
źródło
2
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Yan Sklyarenko
9

Możesz również zainstalować Cygwin, który daje Dotyk oraz mnóstwo innych poleceń * NIX.

jamesaharvey
źródło
2
nie mogę żyć w systemie Windows bez programu Cygwin.
jweede
A cygwin bez mięty jest dość kulawy.
Ahe
5

Istnieją porty Windows wielu narzędzi uniksowych. Wystarczy popatrzeć na unxutils lub GnuWin32 projektów.

VladV
źródło
5

Z podobnego pytania na temat przepełnienia stosu.

Aby zaktualizować znaczniki czasu (ignorując inne funkcje touch), wybrałbym:

copy /b filename.ext +,,
Dennis Williamson
źródło
1
Jest to powtórzenie odpowiedzi Gish Domains sprzed 2 lat bez wyjaśnienia.
fixer1234
4

ze strony:

Funduc Software Touch to bezpłatne narzędzie „dotykowe”, które umożliwia zmianę znaczników czasu / daty i / lub atrybutów w jednym lub kilku plikach. Ponadto FS Touch może dodawać / odejmować określoną liczbę sekund od istniejącego czasu pliku. Możesz określić, które pliki i / lub podkatalogi mają zostać zmienione za pomocą „złożonych masek plików”. Program może być uruchamiany interaktywnie lub z wiersza poleceń. Nowością w wersji 7.2 jest przełącznik wiersza poleceń służący do zmiany zmodyfikowanego pliku +/- określoną liczbę sekund.

FS Touch działa na systemach Windows XP, Vista, Windows 7 i Windows 8.


źródło
4

Tę treść można zapisać w pliku reg. Spowoduje to dodanie menu kontekstowego kliknięcia prawym przyciskiem myszy dla wszystkich plików z funkcją „Plik dotykowy” (testowane w systemie Windows 7). Skopiuj wszystkie poniższe wiersze do pliku reg. Uruchom plik i zatwierdź pytanie. Kliknij prawym przyciskiem myszy dowolny plik (lub wiele plików) - opcja „Plik dotykowy” jest już dostępna.

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\" +,,"

źródło
3

Jeśli używasz git do jednego lub więcej projektów, polecenie mingw git-bashdla systemu Windows ma touchpolecenie. Chcę podziękować @ greg-hewgill za wskazanie mi, że istnieją narzędzia nix dla systemu Windows, ponieważ to właśnie wpadłem na pomysł, aby spróbować dotknąć git-bash.

Superole
źródło
3

w PowerShell spróbuj:

ni fileName.txt

NIjest aliasem polecenia cmdlet New-Item .

Twisty
źródło
1
Witamy w SuperUser. Dzięki za opublikowanie! Czy możesz dodać link do strony internetowej, który zawiera więcej informacji na temat nipolecenia, a może bardziej szczegółowo opisać działanie polecenia?
hBy2Py
1
Polecenia New-Itemcmdlet nie można użyć do aktualizacji sygnatury czasowej istniejącego pliku.
Twisty Impersonator,
Chociaż nie aktualizuje znacznika czasu, tworzy nowy plik, tak jak robi to dotyk. +1 ode mnie
MikeMurko
2

Zapisz następujące dane jako touch.bat w folderze% windir% \ system32 lub dodaj folder, w którym jest zapisany, do zmiennej środowiskowej PATH:

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

Przykładowe użycie:

touch *.cpp
touch somefile.c

Odniesienie: Microsoft KB 69581

Tim Partridge
źródło
Doskonały! Brak zewnętrznych elementów, wystarczy skopiować. I oczywiście większość z nas potrzebuje go jako striptizu partii :)
Bogdan Gavril MSFT
2

Znalazłem szybki sposób, aby to zrobić, jeśli masz zainstalowany vim (nie jest to dobre dla dużych plików, otworzy cały plik, a następnie go zamknie ...)

vim foobar.txt +wq!

„+” Ustawia argument, aby uruchomić następujące polecenia. „wq!” to „pisać, wychodzić, wymuszać”. Spowoduje to otwarcie pliku, zapisanie, a następnie natychmiast zamknięcie.

Jason
źródło
Bezcelowo złożone, nieporęczne i nieprzenośne. -1
MD XF
2

Chciałem, aby funkcja dotykowa polegała na klonowaniu / powielaniu dat pliku z innego pliku, natywnie i aby była możliwa do użycia z pliku wsadowego.

Zatem przeciągnij i upuść plik wideo do pliku wsadowego, uruchomi się FFMPEG, a następnie „Data utworzenia” i „Data modyfikacji” z pliku wejściowego zostaną skopiowane do pliku wyjściowego.

Początkowo wydawało się to proste, dopóki nie okaże się, że pliki wsadowe są okropne w obsłudze nazw plików Unicode, wbudowany program PowerShell miesza się z symbolami nazw plików, a podwójne ucieczka jest koszmarem.

Moje rozwiązanie polegało na tym, aby część „dotykowa” była oddzielnym skryptem PowerShell, który nazwałem „CLONE-FILE-DATE.ps1” i zawiera:

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

Oto przykład użycia w moim pliku wsadowym „CONVERT.BAT”:

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

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

Myślę, że PowerShell jest czytelny, więc po prostu wyjaśnię mówienie partii:

% ~ dp0 to bieżący katalog pliku wsadowego.

% ~ 1 jest ścieżką pliku upuszczonego na partię bez cudzysłowów.

CHCP 65001> nul ustawia znaki na UTF-8 i połyka dane wyjściowe.

-ExecutionPolicy ByPass umożliwia uruchamianie programu PowerShell bez potrzeby modyfikowania globalnej polityki, która ma zapobiegać przypadkowemu uruchamianiu skryptów.

WhoIsRich
źródło
1

Próbować

plik fsutil createnew new.txt 0


źródło
2
The FSUTIL utility requires that you have administrative privileges.- i nie zachowuje się jak w touchprzypadku istniejących plików.
Keith Thompson
1

Pięć wyżej wymienionych alternatyw oraz trzy inne nie wymienione tutaj można znaleźć w SuperUser: „Windows Recursive Touch Command”

JdeBP
źródło
2
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Yan Sklyarenko
1

Cóż, jeśli naprawdę chcesz mieć touchdostępne polecenie, możesz umieścić to w pliku wsadowym o nazwie touch.bati włożyć C:\Windows:

TYPE NUL >>%1

Wystarczająco proste.

MD XF
źródło
Metoda ta nie aktualizuje Zmodyfikowany czas na następujących platformach: Windows Server 2012 R2, Windows Server 2016, Windows 10
Nate
0

Uniksowi naprawili ogólny problem aktualizacji daty pliku dowolnego pliku za pomocą polecenia dotykowego . Jednak w przypadku systemu Windows czasami możliwa jest prostsza metoda w szczególnych przypadkach.

Muszę zaktualizować znacznik czasu skrótu do aplikacji w systemie Windows 8.1, aby zmiany koloru tła Kafelka aplikacji były widoczne, zobacz to pytanie SO . Zamiast implementować jedno z powyższych sprytnych narzędzi, łatwiej jest mi edytować pole komentarza skrótu. Większość ludzi pozostawia to puste, ale oczywiście szybko pojawia się przydatny komentarz. A jeśli komentarz istnieje, dodanie lub usunięcie ostatniego okresu nigdy nie zaszkodzi.

Roland
źródło
0

Rozumiem, że to stare pytanie, właśnie odkryłem dotyk w moim systemie Windows 10. Pobrałem i zainstalowałem Git stąd (tak mi się wydaje) i wygląda na to, że dotyk i różne inne narzędzia znajdują się w folderze bin.

0909EM
źródło