Эквивалент Windows Touch (т. Е. Способ node.js для создания index.html)


209

На машине с Windows я получаю эту ошибку

'touch' не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

когда я следую инструкциям :

touch index.html app.js style.css

Есть ли в Windows эквивалент использования «прикосновения»? Нужно ли мне создавать эти файлы вручную (и изменять их, чтобы изменить метку времени), чтобы реализовать такую ​​команду? Это не кажется очень ... узловатым ...


5
А простой поиск Google показывает вам множество окон реализаций touch. Другое обсуждение здесь: superuser.com/questions/10426/… и библиотека Cygwin - это общий набор инструментов команд Unix в Windows.
jfriend00

4
Возможный дубликат этого вопроса: stackoverflow.com/questions/26343974/…
Plastic Sturgeon


1
Перейдите к ответу Рагувира напрямую, если вы попали сюда при использовании PowerShell.
RBT

Ответы:


293

в типе окна cmd:

type nul > your_file.txt

Это создаст 0 байтов в файле your_file.txt.

Другой способ сделать это - использовать команду echo :

echo.> your_file.txt

эхо. - создаст файл с одной пустой строкой.

Отредактировано 01.04.2019:

Если вам нужно сохранить содержимое файла, используйте >> вместо>

>   Creates a new file
>>  Preserves content of the file

пример

type nul >> your_file.txt

Отредактировано 07.04.2020

Вы также можете использовать команду вызова .

Вызывает одну пакетную программу из другой, не останавливая родительскую пакетную программу. Команда call принимает метки как цель вызова.

Пример:

call >> your_file.txt

2
в Windows 7 первый вариант вызывает пугающий диалог, а затем вы видите его access deniedв консоли. Второй вариант отлично работает!
Декодировано

16
Ответ неверный, он работает только тогда, когда файл не существует. Если файл существует, использование >>первого ничего не делает, второе добавляет строку в конец файла. Правильный ответ: superuser.com/questions/10426/…
stenci

3
@stenci - Я просто попробовал его на несуществующем файле, и он работал нормально. Он создал файл нормально. Может у вас нет прав админа?
dcp 07

2
@stenci, эта ссылка суперпользователя великолепна. Вы должны опубликовать это как ответ.
Дениз Скидмор

@DeniseSkidmore Спасибо, я добавил ответ. Это глубоко, и люди с большей вероятностью прочитают мой комментарий к этому ответу, чем мой ответ, но теперь он там.
stenci

68

Windows изначально не включает touchкоманду.

Вы можете использовать любую из доступных общедоступных версий или собственную версию. Сохраните этот код как touch.cmdи поместите его где-нибудь на своем пути

@echo off
    setlocal enableextensions disabledelayedexpansion

    (for %%a in (%*) do if exist "%%~a" (
        pushd "%%~dpa" && ( copy /b "%%~nxa"+,, & popd )
    ) else (
        type nul > "%%~fa"
    )) >nul 2>&1

Он будет перебирать этот список аргументов и для каждого элемента, если он существует, обновлять временную метку файла, в противном случае создавать его.


это лучший, работает точно так, как ожидалось ... другие решения здесь работают, но оставляют тексты предупреждений / ошибок, IDK, если это эксклюзивно для меня.
Шакил

38

Вы можете использовать эту команду: ECHO >> filename.txt

он создаст файл с заданным расширением в текущей папке.

ОБНОВИТЬ:

для использования пустого файла: скопируйте NUL filename.txt


8
Еще лучше type NUL > filename(создает файл размером 0 байт)
krzemian

24
Как и touch, это не перезапишет файл, если он существует:type NUL >> filename
henon

6
Это отличный способ добавить «ECHO включено». в ваш файл.
ripvlan

5
это не обновляет метку времени существующих файлов.
Дениз Скидмор

1
Я думаю, что Дениз Скидмор отвечает на henon, а не на OP. (Я
Кейт Рассел

28

Ответ неверный, он работает только тогда, когда файл не существует. Если файл существует, использование первого ничего не дает, а второе добавляет строку в конец файла.

Правильный ответ:

copy /b filename.ext +,,

Я нашел его здесь: /superuser/10426/windows-equivalent-of-the-linux-command-touch/764721#764721


1
Этот ответ не работает, если файл не существует. (CMD выдает ошибку.)
Кейт Рассел

16

Используйте следующую команду в командной строке:

fsutil file createnew filename  requiredSize

Информация о параметрах выглядит следующим образом:

fsutil - Утилита файловой системы (исполняемый файл, который вы запускаете)

file - запускает действие файла

createnew - действие, которое нужно выполнить (создать новый файл)

filename - будет буквально имя файла

requiredSize - выделит размер файла в байтах в созданном файле


2
Чтобы это можно было считать достойным ответом, требуется некоторое объяснение. Непонятно, что означают эти пять слов.
jfriend00

2
у меня сработало ... вещь requiredSize странная ... команда просто заполняет ваш новый файл тысячами NULLs ... странно ... так что просто используйте 0 ... генерирует ошибку, если вы пропустите requiredSize .. .
dsdsdsdsd

1
этой команде нужны права администратора :(
ADJ

1
touch также обновляет метку времени для существующих файлов, а не только создает новые файлы.
Дениз Скидмор

1
Touch - это быстрый способ сделать это, ближе всего к нему будет echo или type, я думаю, хотя это очень удобный инструмент для написания сценариев и широко используется в WS16, палец вверх! docs.microsoft.com/en-us/windows-server/administration/…
Алан,

16

Я удивлен, как много здесь неправильных ответов . Ничего не эхо в файле заполнит файл чем-то вроде ECHO is ON, а попытка эха $nulв файл буквально поместит его $nulв файл. Кроме того, для PowerShell эхо $nullв файл на самом деле не создает файл размером 0 КБ, а что-то закодированное как UCS-2 LE BOM, что может стать беспорядочным, если вам нужно убедиться, что ваши файлы не имеют отметки порядка байтов.

После тестирования всех ответов здесь и ссылки на некоторые похожие, я могу гарантировать, что они будут работать для каждой консоли. Просто перейдите FileName.FileExtensionна полный или относительный путь к файлу, который вы хотите touch; Спасибо Кейту Расселу за COPY NUL FILE.EXTобновление:

CMD с обновлениями меток времени

copy NUL FileName.FileExtension

Это создаст новый файл с именем, которое вы поместили, а не FileName.FileExtensionразмером 0 байт. Если файл уже существует, он скопирует себя на место, чтобы обновить временную метку. Я бы сказал, что это скорее обходной путь, чем функциональность 1: 1, touchно я не знаю никаких встроенных инструментов для CMD, которые могут выполнять обновление метки времени файла без изменения какого-либо другого его содержимого.

CMD без обновлений меток времени

if not exist FileName.FileExtension copy NUL FileName.FileExtension

Powershell с обновлениями меток времени

if (!(Test-Path FileName.FileExtension -PathType Leaf)) {New-Item FileName.FileExtension -Type file} else {(ls FileName.FileExtension ).LastWriteTime = Get-Date}

Да, он будет работать в консоли как однострочный; нет необходимости помещать его в файл сценария PowerShell.

PowerShell без обновлений меток времени

if (!(Test-Path FileName.FileExtension -PathType Leaf)) {New-Item FileName.FileExtension -Type file}


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

2
Замечательное наблюдение, RoG! Я обновил ответ, чтобы решить эту проблему :)
kayleeFrye_onDeck

1
Это лучший ответ. Однако я бы все равно улучшил его, заменив fsutil file CreateNew FileName.FileExtension 0на copy NUL Filename.FileExtension, поскольку последний короче и делает то же самое.
Кейт Рассел

@KeithRussell IIRC была конкретная причина , я не использовал copyболее , fsutilно это было какое - то время ... Я уверен , что, как я даже узнал о fsutilха - ха! Я попытаюсь понять, почему ...
kayleeFrye_onDeck

1
Даже если они действительно ведут себя так же, я думаю, что для меня преждевременно говорить, что один лучше, без тестирования скорости.
Кейт Рассел

13

В Windows Power Shell вы можете использовать следующую команду:

New-Item <filename.extension>

или

New-Item <filename.extension> -type file

Примечание: New-Item можно заменить его псевдонимом ni


3
Это настоящий ответ в современном мире Windows, где PowerShell является программой командной оболочки по умолчанию.
RBT

Не уверен, о какой Windows вы имеете в виду, я только что установил новую Windows 10, и Powershell определенно не является оболочкой по умолчанию. 'New-Item' is not recognized as an internal or external command
user5359531

Это лучший ответ для PowerShell 5 в Windows 7.
jhyry-gcpud

8

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

$>>filename

Это пытается выполнить вызываемую программу $, но если $она не существует (или не является исполняемым файлом, который производит вывод), то вывод не производится. По сути, это взлом функциональности, однако вы получите следующее сообщение об ошибке:

'$' не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

Если вам не нужно сообщение об ошибке, вы можете сделать одно из двух:

type nul >> filename

Или:

$>>filename 2>nul

Команда typeпытается отобразить содержимое nul, которое ничего не делает, кроме как возвращает EOF (конец файла) при чтении.

2>nulотправляет ошибочный вывод (вывод 2) в nul (который игнорирует весь ввод при записи). Очевидно, что вторая команда (с 2>nul) становится избыточной из-за этой typeкоманды, поскольку ее быстрее вводить. Но, по крайней мере, теперь у вас есть возможность и знания.


Это здорово, но %ERRORLEVEL%всегда устанавливается ненулевое значение. Вы можете решить эту проблему, добавив noop || cd., но это всегда устанавливает ошибку в 0, что может быть не тем, что вам нужно, если "касание" не работает.
Кейт Рассел

5

Для эмуляции команды Touch в Unix / Mac OS X в терминале Windows Powershell typeне echoтребуется никаких команд . Просто используйте следующее сокращение:

$null > filename

Это создаст пустой файл с именем «имя файла» в вашем текущем местоположении. Используйте любое расширение имени файла, которое может вам понадобиться, например .txt.

Источник: /superuser/502374/equivalent-of-linux-touch-to-create-an-empty-file-with-powershell (см. Комментарии)


1
Похоже, вы пропустилиecho
Sabithpocker

@sabithpocker в Windows cmd, $ null не существует, и, поскольку он не существует, он не производит никакого вывода. Вы $null > filenameотправляете этот пустой вывод в filename (если вы уловили мой дрейф).
Keldon Alleyne 01

1
@sabithpocker В Windows Powershell он работает без echoв стандартном терминале командной строки (cmd), который вам нужен echo. Извините за путаницу.
Оливер Шафельд

@OliverSchafeld и Keldon Спасибо за объяснение.
sabithpocker 04

1
Это добавляет спецификацию в файл.
kayleeFrye_on, декабрь

4

как уже упоминалось

echo >> index.html

это может быть любой файл с любым расширением, затем выполните

notepad index.html

это откроет ваш файл в редакторе блокнота


3

Вы также можете использовать copy con [filename] в командном окне Windows (cmd.exe):

C:\copy con yourfile.txt [enter]
C:\CTRL + Z [enter] //hold CTRL key & press "Z" then press Enter key.
^Z
    1 Files Copied.

Это создаст файл с именем yourfile.txtв локальном каталоге.


3

Я использую cmder(эмулятор командной строки)

Он позволяет запускать все команды Linux на машине Windows.

Его можно скачать с https://cmder.net/

мне это и вправду нравится


1
что случилось с предупреждением "Неизвестный издатель", когда я пытаюсь открыть Cmder в win10? Облом.
Chris22

3

Из терминала Visual Code Studio в Windows 10 у меня сработало следующее, чтобы создать новый файл:

type > hello.js
echo > orange.js
ni > peach.js

2

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

type test.c > test.c.bkp && type test.c.bkp > test.c && del test.c.bkp

1

Если на вашем компьютере установлен Cygwin , вы можете просто использовать прилагаемый исполняемый файл для сенсорного ввода (также через командную строку Windows):

C:\cygwin64\bin\touch.exe <file_path>

1

Как указывает Рагхувир в своем ответе , niэто псевдоним PowerShell для New-Item, поэтому вы можете создавать файлы из командной строки PowerShell, используя niвместо сенсорного ввода.

Если вы предпочитаете печатать touchвместо ni, вы можете установить touchпсевдоним для New-Itemкомандлета PowerShell .

Создание сенсорной команды в Windows PowerShell:

В командной строке PowerShell определите новый псевдоним.

Set-Alias -Name touch -Value New-Item

Теперь сенсорная команда работает почти так же, как вы ожидаете. Единственная разница в том, что вам нужно разделить список файлов запятыми.

touch index.html, app.js, style.css

Обратите внимание, что это устанавливает только псевдоним для PowerShell. Если PowerShell вам не подходит, вы можете настроить WSL или использовать bash для Windows.

К сожалению, псевдоним будет забыт, как только вы завершите сеанс PowerShell. Чтобы сделать псевдоним постоянным, вы должны добавить его в свой профиль пользователя PowerShell.

В командной строке PowerShell:

notepad $profile

Добавьте определение псевдонима в свой профиль и сохраните.


0

Для очень простой версии, touchкоторая в основном использовалась бы для создания 0-байтового файла в текущем каталоге, альтернативой было бы создание touch.batфайла и либо добавление его %Path%в C:\Windows\System32каталог, либо его копирование в каталог, например:

touch.bat

@echo off
powershell New-Item %* -ItemType file

Создание одного файла

C: \ Users \ YourName \ Desktop> коснитесь a.txt

    Каталог: C: \ Users \ YourName \ Desktop

Режим LastWriteTime Длина Имя
---- ------------- ------ ----
-a ---- 2020-10-14 22:28 0 a.txt

Создание нескольких файлов

C: \ Users \ YourName \ Desktop> нажмите "b.txt, c.txt"

    Каталог: C: \ Users \ YourName \ Desktop

Режим LastWriteTime Длина Имя
---- ------------- ------ ----
-a ---- 2020-10-14 22:52 0 b.txt
-a ---- 2020-10-14 22:52 0 c.txt

Также

  • Работает как с PowerShell, так и с командной строкой.
  • Работает с существующими подкаталогами.
  • Не создает файл, если он уже существует:
Новый элемент: файл «C: \ Users \ YourName \ Desktop \ a.txt» уже существует.
  • Для нескольких файлов создаются только несуществующие файлы.
    • Принимает список имен файлов, разделенных запятыми, без пробелов или заключенный в кавычки, если пробелы необходимы:
C: \ Users \ YourName \ Desktop> touch d.txt, e.txt, f.txt
C: \ Users \ YourName \ Desktop> нажмите "g.txt, 'имя с пробелами'"


-1

Да, вы можете использовать Node for Touch, я просто использую его, и он отлично работает в Windows Cmd или gitbash

введите описание изображения здесь


Я не отрицал это, но объясню, почему, вероятно, так оно и было. Этот вопрос был помечен [cmd], и это означает, что OP хочет получить ответ, который работает для CMD "из коробки", что означает отсутствие утилит командной строки, которые не были бы упакованы при установке Windows по умолчанию. Это исключает практически все языки сценариев, даже встроенные языки сценариев Windows, такие как CScript, WScript и PowerShell. Дело не в том, что он работает в среде CMD, а в том, что это возможно для всех, у кого есть доступ к CMD, не считая проблем с разрешениями.
kayleeFrye_onDeck
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.