2012-11-07 19:28:02 +0000 2012-11-07 19:28:02 +0000
180
180

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

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

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

touch filename

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

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

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

Ответы (14)

171
171
171
2012-11-07 19:36:41 +0000

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

echo $null >> filename
113
113
113
2013-01-24 06:39:09 +0000

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

New-Item -ItemType file example.txt

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

(gci example.txt).LastWriteTime = Get-Date
78
78
78
2013-03-25 12:47:36 +0000

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

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
    }
}
24
24
24
2012-11-07 19:32:59 +0000

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

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

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

touch myfile.txt Источник

14
14
14
2014-09-30 05:10:25 +0000

Для этой задачи я предпочитаю

fc > filename

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

fc >> filename

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

fc filename

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

ft -> Format-Table
fw -> Format-Wide
```.
11
11
11
2017-06-15 16:45:40 +0000

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

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

ni x.js

3 chars быстрее, чем на ощупь!

8
8
8
2013-01-26 00:33:10 +0000

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

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

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

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
6
6
6
2017-03-08 23:30:09 +0000

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

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

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] {неизвестная строка | | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | по умолчанию | oem}]. Вы также можете подключить что-то к Out-File, чтобы дать файлу некоторые текстовые данные для хранения, а также флаг -append. Например:

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

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

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

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

Если вы не уверены в том, какая у вас кодировка, я обнаружил, что у VS-Code есть замечательная возможность, где в правом нижнем углу написано, что это за кодировка. Я думаю, что Блокнот++ также имеет похожую возможность.

5
5
5
2013-03-08 12:47:19 +0000

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

notepad $profile

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

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

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

. $profile

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

touch testfile.txt

Чтобы добавить новый файл в каталог типа ‘myfolder’:

touch myfolder\testfile.txt

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

Надеюсь, это поможет

Справка по бонусу:

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

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

Использование того же самого файла:

mkdir testfolder
mkdir testfolder\testsubfolder
5
5
5
2013-08-12 12:52:52 +0000
ac file.txt $null

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

3
3
3
2013-02-25 22:19:10 +0000

Для описанного вами сценария (когда файл не существует) это просто и быстро:

PS> sc example.txt $null

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

2
2
2
2015-11-02 14:58:44 +0000

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

fsutil file createnew file.name 0

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

2
2
2
2016-05-06 06:21:30 +0000

Веб-страница _COPY19_for_unixer.html предлагает:

new-item -type file [filename]

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

Это не выполняет другую функцию Unix touch, а именно обновление метки времени, если filename уже существует, но вопрос подразумевает, что пользователь просто хочет создать файл нулевого размера интерактивно, не прибегая к Блокноту.

2
2
2
2017-03-22 17:21:01 +0000

Я использовал имя “Write-File”, потому что “Touch” не является утвержденным глаголом PowerShell . Однако я до сих пор называю его “Touch”.

Touch.psm1

<#
 .Synopsis
  Creates a new file or updates the modified date of an existing file.

 .Parameter Path
  The path of the file to create or update.
#>
Function Write-File {
    [CmdletBinding()]
    Param(
       [Parameter( Mandatory=$True, Position=1 )]
       [string] $Path,
       [switch] $WhatIf,
       [System.Management.Automation.PSCredential] $Credential
    )
    $UseVerbose = $PSCmdlet.MyInvocation.BoundParameters['Verbose'].IsPresent -eq $True
    $UseDebug = $PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent -eq $True
    $TimeStamp = Get-Date
    If( -Not [System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters( $Path ) ) {
        New-Item -ItemType:File -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -ErrorAction SilentlyContinue -Confirm:$False | Out-Null
    }
    Set-ItemProperty -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -Name LastWriteTime -Value:$TimeStamp -Confirm:$False | Out-Null
}

Set-Alias -Name touch -Value Write-File

Export-ModuleMember -Function Write-File
Export-ModuleMember -Alias touch

Usage:

Import-Module ./Touch.psm1
touch foo.txt

Поддержка:

  • Пути в других каталогах
  • Credential для сетевых путей
  • Verbose, Debug, и флаги WhatIf
  • подстановочные знаки (только для обновления временных меток)

Похожие вопросы

3
19
10
28
3