Windows-эквивалент команды Linux «Сенсорный»?


175

Что вы используете, когда хотите обновить поле с измененной датой файла в Windows?

  1. Команды, доступные через C ++, .NET, C # или что-то родное для Windows (предпочтительно Vista)
  2. инструменты / приложения желательно бесплатные, а также по возможности с открытым исходным кодом

Изменить: здесь уже есть страница для приложений, как указано CheapScotsman здесь .

Если кто-нибудь знает, как я могу сделать это через C ++, C #, WSH или что-то подобное, ну и хорошо, иначе я бы подумал, что все остальное рассматривается в связанном вопросе.


Четыре альтернативы, упомянутые выше, плюс еще четыре, не упомянутые здесь, можно найти в ответе на аналогичный вопрос: «Windows Recursive Touch Command»
JdeBP

stackoverflow.com/questions/210201/… упоминает нагрузку, в том числеREM.>a
barlop

Ответы:


356

Если вы хотите прикоснуться к отметке даты файла с помощью Windows, используйте следующую команду в командной строке:

copy /b filename.ext +,,

(где имя filename.extвашего файла). Это +,,специальный флаг, copyуказывающий ему просто обновить дату / время в файле :

* Изменение времени и даты файла

Если вы хотите назначить текущее время и дату файлу без изменения файла, используйте следующий синтаксис:

copy /b Source+,,

Запятые указывают на пропуск параметра Destination.

Редактируйте на основе комментариев Луми и Джастина: поместите это в пакетный файл, например. touch.cmd

@COPY /B %1+,, %1

Это работает, даже если файл не находится в текущем каталоге (протестировано в Windows 7).


4
Это будет медленно, если файлы большие.
моб

14
type touch.batэто @echo offи следующая строка copy /b %1 +,,- вставьте это C:\binили что у вас есть для ваших собственных сценариев, и тогда вы можете использовать его как touch myfile.txt.
Луми

17
В Win7 это не будет работать, если вы не находитесь в папке, содержащей файл. Это создаст копию в текущем рабочем каталоге.

6
Если вам нужно сделать это в удаленной папке (UNC-путь) - вы также должны указать место назначения для команды копирования - copy /b Source+,, Source- где указан Sourceполный путь к файлу
Джастин


162

Я использовал и рекомендую unxutils, которые являются родными портами Win32 многих распространенных утилит Unix. Там есть touchкоманда.


6
Как и почти любой порт unix-to-windows, он не работает с символами юникода в именах файлов вне кодировки, установленной по умолчанию для программ, не поддерживающих Юникод. Проверьте имя файла, которое сработает при каждом таком инструменте:"test тест τεστ.txt"
RomanSt

У gnuwin32 есть это. но, действительно, gnuwin32 также не работает для символов Юникода.
Бароп

1
Обновление с 2017 года В Windows 10 мы можем использовать подсистему Linux для Windows, которая устанавливает bash. Нет необходимости в Cygwin, MinGW, Unxutils или любом другом частичном Unix для портов Windows. docs.microsoft.com/en-us/windows/wsl/install-win10
Давос,

@Davos вы пробовали это в любом файле, кроме вашего (обычно непривилегированного) пользовательского контекста? Потому что технически пользовательская сторона LXSS работает как непривилегированный пользователь.
0xC0000022L

@ 0xC0000022L не уверен, что вы имеете в виду в контексте touchкоманды. Это похоже на все, что есть в средах nix: вы можете сделать это или сделать sudo, или нет, потому что у вас нет привилегий.
Давос

96

Если все, что вам нужно, это изменить дату последнего изменения файла (в моем случае):

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

9
PowerShell FTW. Я имею в виду, серьезно, Unix это круто, но PS круче.
матовый

1
Вы также можете обновить время последней записи для нескольких файлов / папок

12
Это будет работать только на один файл. Для нескольких файлов: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date}
Эли Альгранти

2
Если вы хотите сделать это рекурсивно, это работает довольно хорошо: gci -recu -inc " . " | % {$ _. LastWriteTime = Get-Date}
BrainSlugs83

6
@ BrainSlugs83: используйте backticks `для кода:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix

58
type nul >>file & copy file +,,
  • Создает, fileесли его не существует.
  • Оставляет содержимое файла в покое.
  • Просто использует cmdвстроенные модули.
  • И последний доступ и создание раз обновляется.

ОБНОВИТЬ

Г! Это не работает для файлов только для чтения, в то время как touchработает. Я предлагаю:

: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"

Жаль, что копия не может игнорировать атрибут + r, как это делает xcopy. Или жаль, что xcopy не поддерживает странный filename +,,синтаксис.
Авель

К сожалению, это не работает (по крайней мере, в Windows 7). Кажется, что интерпретатор команд не обновляет временную метку места назначения перенаправления, если файл фактически не изменен (т. Е. Нет данных для перенаправления).
Synetech

32

@ Тир-том- взрывы:

Вот объяснение Technet таинственных '+' и запятых:

копия / б Источник + ,,

Запятые указывают на пропуск параметра Destination.

Команда copy поддерживает объединение нескольких файлов в один целевой файл. Поскольку пустое место назначения не может быть указано с помощью символа пробела в командной строке, для обозначения этого можно использовать две запятые.

А это ссылка на команду Technet по копированию: http://technet.microsoft.com/en-us/library/bb490886.aspx


16
Теперь это просто испортил синтаксис. Серьезно, о чем они думали? Также обратите внимание, что в той же документации написано «Место назначения: обязательно». Я поражен.
STH

1
Кажется, это не работает даже в Vista ... Интересно, пришли ли они в себя?
Quillbreaker

1
Работает в Windows 7
Imran

5
У меня это работало даже без запятых: copy file.ext + Так что документация настолько же далека от реального поведения, сколько и от любых разумных ожиданий.
Абган

2
Это работало в Windows Server 2008, но только если вы находитесь в папке, содержащей файл
FrinkTheBrave


21

вот рекурсивная версия с использованием powershell ... это изменит время последнего изменения всех файлов и подкаталогов, а также файлов в подкаталогах этого каталога

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

2
Менее многословный, но все же использующий только стандартные короткие сокращения Powershell:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas

15

Проект GnuWin32 имеет порты Windows версий Gnu утилит командной строки Unix.

Он поставляется в виде нескольких отдельных пакетов, и вы можете устанавливать только те команды, которые вам нужны, без каких-либо других зависимостей. Для touchвас потребуется пакет CoreUtils .


15

cygwinидет с touch. Я знаю, что вы упомянули, что вы не хотите устанавливать весь фреймворк, но Cygwin довольно легок и может вызываться из окна командной строки DOS без включенной всей командной строки, подобной Unix.

Вы также можете контролировать, какие инструменты устанавливать, чтобы вы могли просто установить touch.exeфайл и оставить остальную часть фреймворка.


2
К вашему сведению, все, что вам нужно установить, это файл touch.exe и cygwin.dll в каталоге, чтобы использовать этот инструмент. Нет никаких других зависимостей относительно использования инструментов на основе Cygwin.
Высокий Джефф

1
когда я пытаюсь это (win7x64), мне нужно 4 DLL Cygwin в дополнение к touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
Мэтт Вилки

15

Я попытался это создать пустой файл в моем пакетном скрипте. Вы можете использовать это:

ECHO text>file1.txt

3
Это, безусловно , лучший быстрый способ .. Мне просто нужно создать файл .gitignore и Windows 7 продолжает жаловаться «необходимо ввести имя файла» и т.д. и т.п. echo pie>.gitignoreработал лакомство - спасибо!

4
@ Алекс Это не связано, но эта ошибка Windows, потому что файл начинается с точки. В Windows Explorer есть странный хак, чтобы обойти это: конец файла тоже заканчивается точкой. Поэтому введите .gitignore.и при нажатии Enter Windows удаляет завершающий период. Сумасшедший, но это работает.
Брэд Купит

1
Я бы хотел, чтобы у меня было достаточно голосов, чтобы это завоевало популярность крупных игроков.
Джонатан Ми

1
Это не создает пустой файл, хотя файл file1.txt содержит «текст».
Джошуа Мейерс

14

Вот простой regfile, который я написал, чтобы добавить «сенсорный» щелчок правой кнопкой мыши в проводнике Windows . Также было бы легко написать скрипт, так как он просто вызывает:

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

И не забудьте copy nul some_fileсоздать пустой файл (который, как я вижу, touchчаще всего используется).
Джои

Ack! Zip-файл недоступен (что-то о brinkster22.com, который должен быть ссылающимся сайтом). Джон, ты можешь обновить это?
Дан7119

Работает на Win7. Не работает на WinXP: время файла остается тем же после выполнения «копирования».
Егор Скриптунов


11

Попробуйте это из CodeProject .

  • Не нужно устанавливать.
  • Если вы хотите, вы можете даже изменить источник.

2
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Ян Скляренко

9

Вы также можете установить Cygwin, который дает вам Touch, а также множество других команд * NIX.


2
не может жить на окнах без Cygwin.
jweede

И Cygwin без мяты довольно хромой.
Ахе



4

Как насчет кода проекта «Touch для Windows»: http://www.codeproject.com/KB/applications/touch_win.aspx

редактировать; Тот же вопрос, что и здесь: https://stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command/51439


Благодарю. Я пропустил это в своем поиске, который привел к множеству вещей, связанных с телефоном с сенсорным экраном. Наверное, нужен лучший ярлык тега, я думаю.
facepalmd

4

с сайта:

Funduc Software Touch - это бесплатная «сенсорная» утилита, которая позволяет изменять метки времени / даты и / или атрибутов для одного или нескольких файлов. Кроме того, FS Touch может добавлять / вычитать указанное количество секунд из существующего времени файла. Вы можете указать, какие файлы и / или подкаталоги следует изменить с помощью «сложных файловых масок». Программа может быть запущена из интерактивного или командной строки. Новое в версии 7.2 - переключатель командной строки для изменения метки времени изменения файла +/- указанное количество секунд.

FS Touch работает на Windows XP, Vista, Windows 7 и Windows 8.


4

Этот контент может быть сохранен в reg-файл. Это добавит контекстное меню правой кнопки мыши для всех файлов с возможностью «Touch File» (протестировано в Windows 7). Скопируйте все следующие строки в файл reg. Запустите файл и подтвердите вопрос. Щелкните правой кнопкой мыши по любому файлу (или нескольким файлам) - теперь доступна опция «Touch File».

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

Если вы используете git для одного или нескольких проектов, команда mingw git-bashдля Windows имеет touchкоманду. Я хочу поблагодарить @ greg-hewgill за указание на то, что утилиты 'nix существуют для windows, потому что именно это натолкнуло меня на мысль попробовать touch в git-bash.


3

в PowerShell попробуйте:

ni fileName.txt

NIпсевдоним командлета New-Item .


1
Добро пожаловать в SuperUser. Спасибо за публикацию! Можете ли вы добавить ссылку на веб-сайт, который предоставляет больше информации о niкоманде, и, возможно, опишите больше, что делает команда?
hBy2Py

1
New-ItemКомандлет не может быть использован для обновления штампа времени существующего файла.
Твист Имитатор

Хотя он не обновляет отметку времени, он создает новый файл, что и делает сенсорный. +1 от меня.
MikeMurko

2

Сохраните следующий файл как touch.bat в папке% windir% \ system32 или добавьте папку, в которой он сохраняется, в переменную среды PATH:

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

Пример использования:

touch *.cpp
touch somefile.c

Ссылка: Microsoft KB 69581


Отлично! Никаких внешних вещей, просто скопируйте. И, конечно же, большинству из нас это нужно в качестве серийной зачистки :)
Богдан Гаврил MSFT,

2

Я нашел быстрый способ сделать это, если у вас установлен vim (не подходит для больших файлов, откроет весь файл, затем закроет его ...)

vim foobar.txt +wq!

«+» Устанавливает аргумент для запуска следующих команд. "WQ!" это «написать, выйти, заставить». Это откроет файл, сохранит и закроет его сразу после этого.


Бессмысленно сложный, громоздкий и непереносимый. -1
MD XF

2

Я хотел, чтобы «сенсорная» функция клонирования / дублирования файлов датировалась из другого файла, изначально, и была пригодна для использования из пакетного файла.

Таким образом, «перетащите» видеофайл в пакетный файл, FFMPEG запускается, затем «Дата создания» и «Дата изменения» из входного файла копируются в выходной файл.

Сначала это казалось простым, пока вы не обнаружили, что пакетные файлы ужасны при обработке имен файлов в Юникоде, встроенный PowerShell портится с символами имен файлов, и двойное экранирование - это кошмар.

Моим решением было сделать «сенсорную» часть отдельным скриптом PowerShell, который я назвал «CLONE-FILE-DATE.ps1», и он содержит:

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

Тогда вот пример использования в моем пакетном файле '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"

Я думаю, что PowerShell читабельна, поэтому я просто объясню, что такое пакетная речь:

% ~ dp0 - текущий каталог командного файла.

% ~ 1 - путь к файлу, помещенному в пакет без кавычек.

CHCP 65001> nul устанавливает символы в UTF-8 и глотает вывод.

-ExecutionPolicy ByPass позволяет запускать PowerShell без необходимости изменять глобальную политику, которая предотвращает случайное выполнение сценариев людьми.


1

Пытаться

fsutil файл createnew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.- и он не ведет себя так, как touchдля существующих файлов.
Кит Томпсон

1

Пять вариантов, упомянутых выше, плюс еще три, не упомянутые здесь, можно найти в SuperUser: «Windows Recursive Touch Command»


2
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Ян Скляренко

1

Это немного не связано с первоначальным вопросом, но я считаю, что это очень полезно для Windows из-за графического интерфейса.

Я использую утилиту TouchPro, которая предоставляет графический интерфейс ( встроен в оболочку проводника):

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


1

Ну, если вы действительно хотите, чтобы touchкоманда была доступна, вы можете поместить ее в пакетный файл touch.batи вставить в нее C:\Windows:

TYPE NUL >>%1

Достаточно просто.


Этот метод НЕ обновляет измененное время на следующих платформах: Windows Server 2012 R2, Windows Server 2016, Windows 10
конец

0

Люди из Unix исправили общую проблему обновления даты любого файла с помощью команды touch . Однако для Windows иногда более простой способ возможен в особых случаях.

Мне нужно обновить временную метку ярлыка приложения в Windows 8.1, чтобы сделать видимыми изменения цвета фона плитки приложения, см. Этот вопрос ТАК . Вместо того, чтобы реализовывать один из умных инструментов, описанных выше, мне легче редактировать поле комментариев ярлыка. Большинство людей оставляют это пустым, но, конечно, полезный комментарий быстро придумывается. И если комментарий существует, добавление или удаление последнего периода никогда не повредит.


0

Я ценю, что это старый вопрос, я только что обнаружил прикосновение к моей системе Windows 10. Я скачал и установил Git отсюда (я думаю), и похоже, что touch и другие другие утилиты находятся в папке bin.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.