Вопрос Windows эквивалент командной строки «touch»?


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

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

Редактировать:  уже есть страница для приложений, как указано CheapScotsman Вот,

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


151
2018-05-29 00:45


происхождения


Четыре альтернативы, упомянутые выше, плюс еще четыре, не упомянутые здесь, можно найти в ответе на аналогичный вопрос: "Windows Recursive Touch Command" - JdeBP
stackoverflow.com/questions/210201/...    упоминает нагрузку, включая REM.>a - barlop


ответы:


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

copy /b filename.ext +,,

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

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

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

copy /b Source+,,

В запятых указывается отсутствие параметра Destination.

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

@COPY /B %1+,, %1

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


333
2017-09-09 09:13



Что это значит? Где это задокументировано? (Google не индексирует «+», а сайт MS не ведет меня в правильном направлении, так как поиск по «копированию» приносит много полезного.) Я имею в виду, что он отлично работает, и я возьму это много, но мне любопытно. - dash-tom-bang
Документация для copy: technet.microsoft.com/en-us/library/bb490886.aspx - Joseph Hansen
type touch.bat является @echo off и следующая строка copy /b %1 +,, - положить его в C:\bin или что у вас есть для ваших собственных скриптов, а затем вы можете использовать его как touch myfile.txt, - Lumi
В Win7 это не будет работать, если вы не находитесь в папке, содержащей файл. Он создаст копию в текущем рабочем каталоге.
Если вам нужно сделать это в удаленной папке (путь UNC) - вы также должны указать место назначения для команды копирования - copy /b Source+,, Source - где Source включает полный путь к файлу - Justin


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


160
2017-09-09 14:18



Как почти каждый порт unix-to-windows когда-либо, это не работает с символами Unicode в именах файлов за пределами кодировки, установленной по умолчанию для программ, отличных от юникода. Тестовое имя файла, которое будет отключать каждый такой инструмент: "test тест τεστ.txt" - RomanSt
В gnuwin32 есть. но действительно, gnuwin32 также не работает для символов Unicode. - barlop
Обновление с 2017 г. В Windows 10 мы можем использовать подсистему Linux для Windows, которая устанавливает bash. Нет необходимости в cygwin, MinGW, unxutils или любом другом частичном unix для портов Windows. docs.microsoft.com/en-us/windows/wsl/install-win10 - Davos


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

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

90
2018-02-16 15:21



PowerShell FTW. Я имею в виду, серьезно, unix классный, но PS более холодный. - matt
Вы можете обновить последнюю запись времени для нескольких файлов / папок
Это будет работать только в одном файле. Для нескольких файлов: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date} - Eli Algranti
Если вы хотите сделать это рекурсивно, это работает очень хорошо: gci -recu -inc ","|% {$ _. LastWriteTime = Get-Date} - BrainSlugs83
@ BrainSlugs83: используйте backticks `для кода: gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date } - alldayremix


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"

51
2017-11-25 10:51



Жаль, что копия не может игнорировать атрибут + r, как это делает xcopy. Или, жаль, что xcopy не поддерживает странные filename +,, синтаксис. - Abel
К сожалению, это не работает (по крайней мере, не в Windows 7). Похоже, что интерпретатор команд не обновляет временную метку адресата перенаправления, если файл фактически не изменен (т. Е. Нет данных для перенаправления). - Synetech


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

Вот объяснение Технетом таинственных «+» и запятых:

copy / b Источник + ,,

Эти запятые указывают на отсутствие   параметр назначения.

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

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


32
2017-07-13 14:54



Теперь это просто испорченный синтаксис. Шутки в сторону, о чем они думали? Также обратите внимание на ту же документацию: «Назначение: обязательно». ... Я поражен. - sth
Это, похоже, даже не работает в Vista ... Интересно, пришли ли они в чувство? - quillbreaker
Работает в Windows 7 - Imran
Он работал для меня даже без запятых: copy file.ext + Итак, документация настолько же далека от реального поведения, как и поведение от любых разумных ожиданий. - Abgan
Он работал в Windows Server 2008, но только если вы находитесь в папке, содержащей файл - FrinkTheBrave


Если вы чувствуете, что кодируете его самостоятельно, .NET предлагает File.SetLastAccessTime, File.SetCreationTime а также File.SetLastWriteTime методы.


22
2017-09-09 09:18





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

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

21
2017-07-10 11:52



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


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

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


14
2017-09-09 09:17





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

ECHO text>file1.txt

14
2017-09-09 09:13



Это BY FAR лучший быстрый метод. Мне просто нужно было создать файл .gitignore, и Windows 7 продолжает жаловаться «нужно ввести имя файла» и т. Д. И т. Д. echo pie>.gitignore обработал удовольствие - спасибо!
@Alex Это не связано, но эта ошибка окон потому, что файл начинается с периода. В Windows Explorer есть странный хак, чтобы обойти это в Windows Explorer: сделайте файл завершенным периодом. Итак, тип .gitignore. и когда вы нажимаете кнопку ввода, Windows удаляет конечный период. Сумасшедший, но он работает. - Brad Cupit
Хотел бы я, чтобы я мог дать это достаточно, чтобы поймать крупных игроков в популярности. - Jonathan Mee
Это не создает пустой файл, хотя файл file1.txt имеет в нем «текст». - Joshua Meyers


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

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


13
2017-09-09 09:19



К вашему моменту здесь все, что вам нужно установить, - это файл touch.exe и cygwin.dll в каталоге для использования этого инструмента. Других зависимостей от использования инструментов на основе cygwin нет. - Tall Jeff
когда я пытаюсь это сделать (win7x64) мне нужно 4 cygwin dll в дополнение к touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll - matt wilkie


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

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

13
2017-12-31 12:39



И не забывайте copy nul some_file создать пустой файл (вот что я вижу touch чаще всего используется). - Joey
Ack! Zip-файл недоступен (что-то о том, что сайт brinkster22.com должен быть ссылочным сайтом). Джон, можешь ли ты это обновить? - Dan7119
Работает на Win7. Не работает на WinXP: время файла остается неизменным после выполнения «копии». - Egor Skriptunoff