Эквивалент Linux `touch` для создания пустого файла с PowerShell?

141070
jsalonen

В PowerShell есть эквивалент touch?

Например, в Linux я могу создать новый пустой файл, вызвав:

touch filename 

В Windows это довольно неудобно - обычно я просто открываю новый экземпляр блокнота и сохраняю пустой файл.

Так есть ли в PowerShell программный способ сделать это?

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

136
См. [Версия Windows для сенсорной команды Unix] (http://stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command) & [Windows-эквивалент команды Linux «сенсорный»?] (http://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch) amiregelz 11 лет назад 1
Благодарю. Я посмотрел на них, но большая часть ответа сосредоточена на командной строке. Я хотел бы иметь решение PowerShell, которое не требует от меня установки новых приложений. jsalonen 11 лет назад 0
Снизил вопрос - обе функции - это всего лишь несколько строк кода, просто реализуйте обе, а не только половину, esp. когда недостающая половина другой команды настолько опасна. yzorg 10 лет назад 0
@yzorg: Что вы подразумеваете под обеими функциями? Я только спрашивал, как создать пустой файл в PS, как вы можете сделать с `touch` в Linux. jsalonen 10 лет назад 0
@jsalonen Используйте * nix `touch` для существующего файла, он обновит время последней записи без изменения файла, см. ссылки из @amiregelz. Этот вопрос имеет высокий рейтинг в Google за `powershell touch`, я хотел предупредить копировщиков / копировщиков, что только эта половина может уничтожить данные, а * nix touch - нет. Смотрите ответ @LittleBoyLost, который обрабатывает, когда файл уже существует. yzorg 10 лет назад 0
@jsalonen IOW, если вы перефразируете вопрос «как создать пустой файл в powershell», я бы убрал свое понижающее голосование, но оставил из него команду * nix `touch`. :) yzorg 10 лет назад 0
@ LưuVĩnhPhúc Уточнил вопрос. Я не ищу полнофункциональный эквивалент касания, просто подходящее поведение для создания пустых файлов. jsalonen 7 лет назад 0

14 ответов на вопрос

143
Yash Agarwal

Using the append redirector ">>" resolves the issue where an existing file is deleted:

echo $null >> filename 
Извините, это не так. Это дает мне что-то вроде `cmdlet Copy-Item в позиции конвейера команд 1. Задайте значения для следующих параметров:` jsalonen 11 лет назад 0
просто нажмите Enter, это выдаст ошибку, но игнорируйте, ваш файл будет создан. Yash Agarwal 11 лет назад 0
На самом деле вы правы, это работает. Тем не менее, это раздражает, если вы работаете так много раз. jsalonen 11 лет назад 0
Хорошо. Я изменил ответ, теперь он должен сделать это в одну строку Yash Agarwal 11 лет назад 1
Также известный как 'echo null> filename' из командной строки, возможно, командный файл. Здорово видеть версию PowerShell, спасибо! Mark Allen 11 лет назад 3
Touch немного отличается от этого, если файл уже существует jk. 11 лет назад 16
возможно, `echo $ null >> filename` будет больше похож на Unix * touch *. Nathan 10 лет назад 1
echo не нужен, `$ null> filename` отлично работает. alirobe 9 лет назад 8
Это пишет 2 байта Unicode BOM 0xFEFF для меня. mlt 8 лет назад 6
Эй, это меняет кодировку на `UTF-16 LE` Rahil Wazir 8 лет назад 1
@mlt Перенаправление в файл в Powershell действительно записывает спецификацию, поэтому этот метод также запишет спецификацию. Этот вопрос объясняет, как записать файл в PS без спецификации (это неизвестно): http://stackoverflow.com/questions/5596982/using-powershell-to-write-a-file-in-utf-8 -без-The-бом Bender the Greatest 7 лет назад 1
Важное примечание: многие инструменты Unix не имеют отношения к спецификации. Это включает в себя мерзавец, например (даже на окнах). У вас будут проблемы, если вы будете использовать файлы, созданные таким образом, с инструментами, которые не распознают спецификации. Например, вы пытаетесь создать свой `.gitignore` с помощью этой команды и удивляетесь, почему он не работает. BOM является причиной. martixy 7 лет назад 4
Да - этот метод на самом деле записывает несколько байтов в файл. Node.js также не может обрабатывать эти байты, создавая синтаксическую ошибку в начале файла. TheHansinator 7 лет назад 0
Ответ с использованием `New-Item` выглядит так, как будто он не устанавливает спецификацию, а кодировка UTF-8. Но в последнее время я только запускаю подсистему Linux для Windows или просто запускаю git bash для окон и использую `Touch`. Я запускаю git bash в PowerShell, запустив `&" c: \ Program Files \ git \ bin \ bash.exe "` Davos 6 лет назад 0
74
LittleBoyLost

Here is a version that creates a new file if it does not exist or updates the timestamp if it does exist.

Function Touch-File { $file = $args[0] if($file -eq $null) { throw "No filename supplied" } if(Test-Path $file) { (Get-ChildItem $file).LastWriteTime = Get-Date } else { echo $null > $file } } 
Это правильный ответ для репликации сенсорной программы Unix (хотя и с другим именем), но вопрос ориентирован на простое создание нового файла. Jamie Schembri 10 лет назад 4
Очень, _очень_ крошечный клеветник: хотя Touch-File соответствует соглашению об именовании Verb-Noun PS, `Touch` не является" одобренным "глаголом (не то, чтобы это существенное требование: https://msdn.microsoft.com/en -us / библиотека / ms714428.aspx). `Файл` в порядке, кстати. Я рекомендую имена `Set-File` или` Set-LastWriteTime` или, мой любимый, `Update-File`. Кроме того, я бы рекомендовал `Add-Content $ file $ null` вместо` echo $ null> $ file`. Наконец, установите псевдоним с помощью `Set-Alias ​​touch Update-File`, если вы хотите продолжать использовать команду` touch` Alan McBee 7 лет назад 11
70
dangph

Чтобы создать пустой файл:

New-Item -ItemType file example.txt 

Чтобы обновить метку времени файла:

(gci example.txt).LastWriteTime = Get-Date 
Я думаю, что это лучший подход! Jayesh Bhoot 10 лет назад 4
Это работает для обновления отметки времени папки? riahc3 9 лет назад 0
@ riahc3, используйте это: `(gi MyFolder) .LastWriteTime = Get-Date`. Вы можете использовать это для файлов тоже. dangph 9 лет назад 1
Еще более содержательно: `ni example.txt` Nick Cox 6 лет назад 4
Этот метод не добавляет ужасных байтов BOM, и кодировка, похоже, выглядит как UTF-8. Davos 6 лет назад 1
24
Ƭᴇcʜιᴇ007

In PowerShell you can create a similar Touch function as such:

function touch 

Usage:

touch myfile.txt

Source

Это здорово, спасибо! Как раз то, что я хотел! Любые идеи, как я мог бы установить эту функцию в PowerShell, чтобы она автоматически загружалась при запуске оболочки? jsalonen 11 лет назад 0
Добавьте его в свой файл профиля $. (Запустите notepad $ profile для редактирования этого файла.) Mark Allen 11 лет назад 2
Это удалит содержимое файла, если он существует. dangph 11 лет назад 23
Or the safe version that does not clear out existing file contents `function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }` alastairtree 6 лет назад 1
10
Steven Penny

я предпочитаю

fc > filename 

для этой задачи. Для работы с непустыми файлами вы можете использовать

fc >> filename 

fcэто просто псевдоним для Format-Custom . Я выбрал его, потому что это короткая команда, которая ничего не делает в этом контексте, ноуп . Это также приятно, потому что если вы забудете о перенаправлении

fc filename 

вместо того, чтобы дать вам ошибку, опять же это просто ничего не делает. Некоторые другие псевдонимы, которые будут работать

ft -> Format-Table fw -> Format-Wide 
8
John Saunders

Я собрал различные источники и нашел следующее, которое отвечало моим потребностям. Мне нужно было установить дату записи DLL, которая была собрана на машине в другом часовом поясе:

$update = get-date Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update 

Конечно, вы также можете установить его для нескольких файлов:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update 
+1 для наиболее эффективного способа изменения свойства LastWriteTime для файла (что мне и было нужно) в Powershell-ih, хотя вопрос был сосредоточен на новой функции создания файлов сенсорной команды. Nathan Hartley 11 лет назад 1
Без использования переменной? riahc3 9 лет назад 0
7
Jacob E. Dawson

Уже есть куча достойных ответов, но мне очень нравится псевдоним New-Item, который просто: ni

Вы также можете отказаться от объявления типа файла (которое, как я полагаю, подразумевается при добавлении расширения), поэтому для создания файла javascript с именем «x» в моем текущем каталоге я могу просто написать:

ni x.js 

3 символа быстрее, чем прикосновение!

Это не идемпотентный `ni: файл 'x.js' уже существует` Steven Penny 6 лет назад 0
4
RafaelGP

Откройте файл своего профиля:

notepad $profile 

Добавьте следующую строку:

function touch 

Сохраните его и перезагрузите свой профиль $, чтобы сразу его использовать. (Не нужно закрывать и открывать powershell)

. $profile 

Чтобы добавить новый файл в текущий каталог, введите:

touch testfile.txt 

Чтобы добавить новый файл в директорию myfolder, введите:

touch myfolder\testfile.txt 

Если файл с таким именем уже существует, он не будет переопределен. Вместо этого вы получите ошибку.

Я надеюсь, что это помогает

Бонусный совет:

Вы можете сделать эквивалент 'mkdir', добавив следующую строку:

function mkdir 

То же использование:

mkdir testfolder mkdir testfolder\testsubfolder 
4
8DH
ac file.txt $null 

Won't delete the file contents but it won't update the date either.

4
Garret Hoffman

Похоже, что куча ответов здесь не учитывает кодировку файлов.

Я просто столкнулся с этой проблемой по разным причинам, но

echo $null > $file  $null > $file 

оба производят файл UTF-16-LE, в то время как

New-Item $file -type file 

создает файл UTF-8.

По какой-то причине fc > $fileи fc >> $file, кажется, также производить файлы UTF-8.

Out-File $file -encoding utf8 

дает вам файл UTF-8-BOM, в то время как

Out-File $file -encoding ascii 

дает вам файл UTF-8. Другие допустимые (но не проверенные) кодировки, которые поддерживает Out-File: [[-Encoding] ]. Вы также можете передать данные в Out-File, чтобы дать файлу некоторые текстовые данные для хранения, а также флаг -append. Например:

echo $null | Out-File .\stuff.txt -Encoding ascii -Append 

этот пример не обновляет временную метку по какой-то причине, но этот:

echo foo | Out-File .\stuff.txt -Encoding ascii -Append 

Хотя у этого есть побочный эффект добавления "foo" в конец файла.

Если вы не уверены в том, какая у вас кодировка, я обнаружил, что VS-Code имеет отличную функцию, где в правом нижнем углу написано, что такое кодировка. Я думаю, что Notepad ++ также имеет аналогичную функцию.

`Set-Content -Path $ file -value $ null` выполняет эту работу и не влияет на кодировку файлов. Проверьте также [ss64-версию `touch`] (https://ss64.com/ps/syntax-touch.html). Anton Krouglov 7 лет назад 0