Вопрос: Эквивалент Linux `touch` для создания пустого файла с помощью PowerShell? [Дубликат]


На этот вопрос уже есть ответ:

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

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

touch filename

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

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

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


132
2017-11-07 19:28


Источник


Видеть Версия Windows для команды Unix touch & Windows эквивалент командной строки «touch»? - amiregelz
Благодарю. Я посмотрел на них, но большая часть ответа сосредоточена на командной строке. Я хотел бы иметь решение PowerShell, которое не требует установки новых приложений. - jsalonen
Вниз поставил вопрос - обе функции - всего лишь несколько строк кода, просто реализуйте оба, а не только наполовину, esp. когда недостающая половина другой команды настолько опасна. - yzorg
@yzorg: Что вы подразумеваете под обеими функциями? Я только спрашивал, как создать пустой файл в PS так, как вы можете сделать с touch в Linux. - jsalonen
@jsalonen Использовать * nix touch в существующем файле он обновит последнее время записи без изменения файла, см. ссылки из @amiregelz. Этот вопрос имеет высокий рейтинг google для powershell touch, Я хотел предупредить copy / paste, что только эта половина может уничтожить данные, когда * nix touch нет. См. Ответ @LittleBoyLost, который обрабатывает, когда файл уже существует. - yzorg


Ответы:


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

echo $null >> filename

136
2017-11-07 19:36



Также известен как «echo null> filename» из командной строки, возможно, командный файл. Прохладный, чтобы увидеть версию PowerShell, спасибо! - Mark Allen
touch отличается от этого, если файл уже существует - jk.
эхо не нужно, $null > filename прекрасно работает. - alirobe
Это пишет для меня 2 байта спецификации Юникода 0xFEFF. - mlt
Важное примечание. Многие инструменты Unix не имеют спецификации спецификации. Это включает git например (даже на окнах). У вас возникнут проблемы, если вы используете файлы, созданные таким образом, с инструментами, которые не распознают спецификации. например вы пытаетесь создать свою .gitignore используя эту команду и задаться вопросом, почему это не сработает. Спецификация - причина. - martixy


Вот версия, которая создает новый файл, если он не существует, или обновляет метку времени, если она существует.

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
    }
}

73
2018-03-25 12:47



Это правильный ответ для репликации сенсорной программы Unix (хотя и с другим именем), но вопрос ориентирован на простое создание нового файла. - Jamie Schembri
Очень, очень крошечный поворот: хотя Touch-файл соответствует соглашению об именах Verb-Noun для PS, Touch не является «одобренным» глаголом (не то, что это важное требование: msdn.microsoft.com/en-us/library/ms714428.aspx). File хорошо, кстати. Я рекомендую имена Set-File или Set-LastWriteTime или, мой любимый, Update-File, Кроме того, я бы рекомендовал Add-Content $file $null вместо echo $null > $file, Наконец, задайте псевдоним с Set-Alias touch Update-File если вы хотите продолжать использовать команду touch - Alan McBee


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

New-Item -ItemType file example.txt

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

(gci example.txt).LastWriteTime = Get-Date

61
2018-01-24 06:39



Я думаю, что это лучший подход! - Jayesh Bhoot
Это работает для обновления временной метки папки? - riahc3
@ riahc3, используйте это: (gi MyFolder).LastWriteTime = Get-Date , Вы также можете использовать это для файлов. - dangph
Еще более содержательный: ni example.txt - Nick Cox
Этот метод не добавляет ужасные байты спецификации, и кодировка с удовольствием выглядит UTF-8. - Davos


В PowerShell вы можете создать аналогичную функцию Touch как таковую:

function touch {set-content -Path ($args[0]) -Value ($null)} 

Применение:

touch myfile.txt

Источник


24
2017-11-07 19:32



Это здорово, спасибо! Только то, что я хотел! Любые идеи о том, как я могу установить эту функцию в PowerShell, чтобы она загружалась автоматически при запуске оболочки? - jsalonen
Добавьте его в файл $ профиля. (Запустите файл notepad $ для редактирования этого файла.) - Mark Allen
Это приведет к удалению содержимого файла, если оно существует. - dangph


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

fc > filename

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

fc >> filename

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

fc filename

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

ft -> Format-Table
fw -> Format-Wide

10
2017-09-30 05:10





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

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

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

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update

7
2018-01-26 00:33



+1 для самого Powershell-ish способа изменить LastWriteTime на файл (это то, что мне нужно), хотя вопрос был сосредоточен на новой функции создания файла команды touch. - Nathan Hartley
Без использования переменной? - riahc3


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

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

ni x.js

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


6
2018-06-15 16:45



Это не идемпотент ni : The file 'x.js' already exists - Steven Penny


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

notepad $profile

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

function touch {New-Item "$args" -ItemType File}

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

. $profile

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

touch testfile.txt

Чтобы добавить новый файл в каталог «myfolder»:

touch myfolder\testfile.txt

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

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

Бонусный наконечник:

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

function mkdir {New-Item "$args" -ItemType Directory} 

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

mkdir testfolder
mkdir testfolder\testsubfolder

4
2018-03-08 12:47





ac file.txt $null

Не будет удалять содержимое файла, но он также не обновит дату.


4
2017-08-12 12:52





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

Я просто столкнулся с этой проблемой по ряду других причин, но

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] {unknown | строка | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | ОЙ}]. Вы также можете передать материал в 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 ++ также имеет аналогичную функцию.


4
2018-03-08 23:30



Set-Content -Path $file -value $null выполняет эту работу, и это не влияет на кодирование файлов. Проверьте также Версия ss64 touch, - Anton Krouglov