Еквівалент Linux `touch`, щоб створити порожній файл з PowerShell? [дублікат]


167

На це питання вже є відповідь тут:

У PowerShell є еквівалент touch?

Наприклад, в Linux я можу створити новий порожній файл шляхом виклику:

touch filename

У Windows це досить незручно - зазвичай я просто відкриваю новий екземпляр блокнота і зберігаю порожній файл.

Отже, чи існує програмний спосіб у PowerShell зробити це?

Я не прагну точно відповідати поведінці дотику, а просто знайти найпростіший можливий еквівалент для створення порожніх файлів.



Дякую. Я подивився на них, але більша частина відповіді зосереджена на командному рядку. Я хотів би мати рішення PowerShell, яке не вимагає від мене встановлення нових програм.
jsalonen

Питання, що викликає суперечки - обидві функції - це лише кілька рядків коду, просто реалізуйте обидва, а не лише половину, esp. коли відсутня половина команди є настільки небезпечною.
yzorg

@yzorg: Що ви розумієте під обома ознаками? Я лише запитував, як створити порожній файл в PS так, як це можна зробити touchв Linux.
jsalonen

@jsalonen Використовуйте * nix touchдля існуючого файлу, він оновить час останнього запису, не змінюючи файл, див. посилання від @amiregelz. Це запитання має високий рейтинг google powershell touch, я хотів попередити копію / вставити, що саме ця половина може знищити дані, коли * nix touch не робить. Дивіться @LittleBoyLost відповідь, яка обробляє, коли файл вже існує.
yzorg

Відповіді:


165

Використання перенаправлення додатка ">>" вирішує проблему, коли видалений існуючий файл:

echo $null >> filename

3
Також відомий як "echo null> filename" з командного рядка, можливо, пакетного файлу. Прикольно бачити його версію PowerShell, дякую!
Марк Аллен

16
touch досить інший, ніж цей, якщо файл вже існує
jk.

9
відлуння зайве, $null > filenameчудово працює.
аліробе

8
Це пише 2 байти унікоду BOM 0xFEFF для мене.
mlt

4
Важлива примітка: Багато інструментів Unix не мають справи з BOM. Сюди входить, наприклад, git (навіть у Windows). У вас виникнуть проблеми, якщо ви використовуєте файли, створені таким чином, з інструментами, які не розпізнають BOM. наприклад, ви намагаєтесь створити свою .gitignoreкоманду за допомогою цієї команди і задаєтесь питанням, чому вона не буде працювати. BOM - причина.
martixy

96

Щоб створити порожній файл:

New-Item -ItemType file example.txt

Щоб оновити часову позначку файлу:

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

4
Я думаю, що це найкращий підхід!
Jayesh Bhoot

Чи працює це для оновлення часової позначки папки?
riahc3

1
@ Riahc3, використовуйте це: (gi MyFolder).LastWriteTime = Get-Date. Ви можете використовувати це і для файлів.
dangph

9
Ще більше жалюгідного:ni example.txt
Нік Кокс

2
Цей метод не додає жахливих байтів BOM, і кодування на щастя, здається, є UTF-8.
Давос

75

Ось версія, яка створює новий файл, якщо він не існує, або оновлює часову позначку, якщо вона існує.

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

4
Це правильна відповідь для тиражування сенсорної програми Unix (хоча і з іншим ім’ям), але питання орієнтоване на просто створення нового файлу.
Джеймі Шембрі

14
Дуже, дуже крихітна каламбур: В той час як Touch-файлу відповідає Дієслово-Іменник іменування ПС, Touchне є «затверджений» дієслово (Не те, що це суттєва вимога: msdn.microsoft.com/en-us/library/ms714428. aspx ). Fileчудово, btw. Я рекомендую імена Set-Fileабо Set-LastWriteTimeабо, мій улюблений, Update-File. Також я б рекомендував Add-Content $file $nullзамість цього echo $null > $file. Нарешті, встановіть псевдонім, Set-Alias touch Update-Fileякщо ви хочете продовжувати використовувати командуtouch
Alan McBee

Запропонуйте додати це як останній рядок:New-Alias -Name Touch Touch-File
stimpy77

25

У PowerShell ви можете створити подібну функцію Touch як таку:

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

Використання:

touch myfile.txt

Джерело


Це чудово, дякую! Просто те, що я хотів! Будь-які ідеї, як я міг би встановити цю функцію в PowerShell, щоб вона автоматично завантажувалася під час запуску оболонки?
jsalonen

2
Додайте його у файл профілю $. (Запустіть блокнот $ профіль, щоб відредагувати цей файл.)
Марк Аллен

25
Це видалить вміст файлу, якщо він існує.
dangph

1
Або безпечна версія, яка не очищає наявний вміст файлу function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree,

13

я віддаю перевагу

fc > filename

для цього завдання. Для роботи з непорожніми файлами можна використовувати

fc >> filename

fcпросто псевдонім для Format-Custom . Я вибрав це, тому що це коротка команда, яка нічого не робить у цьому контексті, noop . Це також приємно, тому що якщо ви забудете переспрямування

fc filename

замість того, щоб давати вам помилку, знову це просто нічого не робить. Деякі інші псевдоніми, які будуть працювати, є

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

9

Вже є купа гідних відповідей, але мені дуже подобається псевдонім New-Item, який справедливий: ni

Ви також можете відмовитись від декларації про тип файлу (яка, я вважаю, неявна при додаванні розширення), тому для створення файлу javascript з іменем 'x' у моєму поточному каталозі я можу просто написати:

ni x.js

3 символи швидше, ніж дотик!


Це не бездумноni : The file 'x.js' already exists
Стівен Пенні

8

Я зібрав різні джерела і завершив наступні, які відповідали моїм потребам. Мені потрібно було встановити дату запису DLL, яка була побудована на машині в іншому часовому поясі:

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

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

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

1
+1 - найпоширеніший спосіб змінити LastWriteTime у файлі (що саме мені потрібно), хоча питання зосереджувалося на новій функції створення файлів сенсорної команди.
Натан Хартлі

Без використання змінної?
riahc3

5

Відкрийте файл свого профілю:

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
ac file.txt $null

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


5

Схоже, купа відповідей тут не враховує кодування файлів.

Я просто зіткнувся з цією проблемою з різних інших причин, але

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 | за замовчуванням | oem}]. Ви також можете передавати матеріали в Out-File, щоб надати файлу текстові дані для зберігання, а також прапор -додаток. Наприклад:

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виконує завдання, і це не впливає на кодування файлів. Перевірте також версію ss64touch .
Антон Круглов

3

Для описаного вами сценарію (коли файл не існує) це швидко і просто:

PS> sc example.txt $null

Однак іншим поширеним використанням touchє оновлення часової позначки файлу. Якщо ви спробуєте використати мій scприклад таким чином, це видалить вміст файлу.


1
Дякую! Що scозначає? Редагувати: розібрався («Встановити вміст»)
jsalonen

2

щоб створити порожній файл у Windows, спосіб завершення полягає в наступному:

fsutil file createnew file.name 0

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


2

Веб-сторінка http://xahlee.info/powershell/PowerShell_for_unixer.html пропонує:

new-item -type file [filename]

і це дійсно створює новий файл розміром нуля.

Це не виконує іншу функцію Unix touch, а саме оновлення часової позначки, якщо ім'я файлу вже існує, але питання передбачає, що користувач просто хоче створити файл нульового розміру інтерактивно, не звертаючись до Блокнота.


1

Я використовував назву "Write-File", оскільки "Touch" не є затвердженим дієсловом PowerShell . Я все ще псевдонім це як дотик.

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

Використання:

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

Підтримує:

  • Шляхи в інших довідниках
  • Credential для мережевих шляхів
  • Verbose, Debugта WhatIfпрапори
  • подвійні картки (лише оновлення часової позначки)

New-ItemКоманда була запропонована у чотирьох попередніх відповідях. Ви надали для цього 20-лінійну обгортку. Чи можете ви пояснити трохи чіткіше, яку перевагу має ваше рішення над попередніми? Наприклад, як ці Verbose, Debugі WhatIfпрапори, і т.д.?
Скотт

Одна важлива відмінність між цією відповіддю і в New-Itemтому, що вона оновлює часові позначки існуючих файлів.
jpaugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.