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

Odpowiednik linuksowego `touch` do tworzenia pustego pliku w PowerShell?

Czy w PowerShell istnieje odpowiednik touch?

Na przykład w Linuksie mogę utworzyć nowy pusty plik wywołując:

touch filename

W Windows jest to dość kłopotliwe – zwykle po prostu otwieram nową instancję notatnika i zapisuję pusty plik.

Czy jest więc jakiś programowy sposób w PowerShell, aby to zrobić?

Nie szukam dokładnego dopasowania zachowania dotyku, ale po prostu znalezienia najprostszego możliwego odpowiednika do tworzenia pustych plików.

Odpowiedzi (14)

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

Użycie przekierowania append “>” rozwiązuje problem, w którym istniejący plik jest usuwany:

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

Aby utworzyć pusty plik:

New-Item -ItemType file example.txt

Aby zaktualizować znacznik czasowy pliku:

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

Oto wersja, która tworzy nowy plik, jeśli nie istnieje, lub aktualizuje znacznik czasu, jeśli istnieje.

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

W PowerShell można stworzyć podobną funkcję Touch w następujący sposób:

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

Użycie:

touch myfile.txt Źródło .

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

Ja preferuję

fc > filename

do tego zadania. Do pracy z niepustymi plikami możesz użyć

fc >> filename

fc jest po prostu aliasem fo Format-Custom . Wybrałem go, ponieważ jest to krótka komenda, która nic nie robi w tym kontekście, noop . Jest to również miłe, ponieważ jeśli zapomnisz o przekierowaniu

fc filename

zamiast dać ci błąd, znowu po prostu nic nie robi. Kilka innych aliasów, które będą działać to

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

Istnieje już kilka godnych odpowiedzi, ale całkiem podoba mi się alias New-Item, który jest po prostu: ni

Można również zrezygnować z deklaracji typu pliku (która, jak zakładam, jest domyślna, gdy dodawane jest rozszerzenie), więc aby utworzyć plik javascript o nazwie “x” w moim bieżącym katalogu, mogę po prostu napisać:

ni x.js

3 znaki szybciej niż dotyk!

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

Zebrałem różne źródła i doszedłem do następującego rozwiązania, które spełniło moje potrzeby. Potrzebowałem ustawić datę zapisu biblioteki DLL, która została zbudowana na maszynie w innej strefie czasowej:

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

Oczywiście, możesz również ustawić to dla wielu plików:

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

Wygląda na to, że kilka odpowiedzi tutaj nie uwzględnia kodowania plików.

Właśnie wpadłem na ten problem, z różnych innych powodów, ale

echo $null > $file

$null > $file

oba produkują plik UTF-16-LE, podczas gdy

New-Item $file -type file

produkuje plik UTF-8.

Z jakiegoś powodu fc > $file i fc >> $file, również wydają się produkować pliki UTF-8.

Out-File $file -encoding utf8

daje ci plik UTF-8-BOM, podczas gdy

Out-File $file -encoding ascii

daje ci plik UTF-8. Inne poprawne (lecz niesprawdzone) kodowania obsługiwane przez Out-File to: [[-Encoding] {unknown | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Możesz także przekazać rzeczy do Out-File, aby dać plikowi jakieś dane tekstowe do przechowania, a także flagę -append. Na przykład:

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

Ten przykład z jakiegoś powodu nie aktualizuje znacznika czasu, ale ten tak:

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

Chociaż ma efekt uboczny w postaci dodania “foo” na koniec pliku.

Jeśli nie jesteś pewien, jakie masz kodowanie, odkryłem, że VS-Code ma fajną funkcję, gdzie w prawym dolnym rogu jest napisane, jakie jest kodowanie. Myślę, że Notepad++ również ma podobną funkcję.

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

Otwórz swój plik profilu:

notepad $profile

Dodaj następującą linię:

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

Zapisz go i przeładuj swój $profile, aby móc go od razu użyć. (Nie trzeba zamykać i otwierać powershell)

. $profile

Aby dodać nowy plik w bieżącym katalogu wpisz:

touch testfile.txt

Aby dodać nowy plik wewnątrz katalogu ‘myfolder’ wpisz:

touch myfolder\testfile.txt

Jeśli plik o tej samej nazwie już istnieje, nie zostanie on nadpisany. Zamiast tego pojawi się błąd.

Mam nadzieję, że to pomoże

Porada bonusowa:

Możesz zrobić odpowiednik ‘mkdir’ dodając następującą linię:

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

To samo użycie:

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

Nie usunie zawartości pliku, ale też nie zaktualizuje daty.

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

Dla scenariusza, który opisałeś (gdy plik nie istnieje), jest to szybkie i proste:

PS> sc example.txt $null

Jednak innym powszechnym zastosowaniem touch jest aktualizacja znacznika czasu pliku. Jeśli spróbujesz użyć mojego przykładu sc w ten sposób, spowoduje to skasowanie zawartości pliku.

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

aby utworzyć pusty plik w windows, najszybszym sposobem jest następujący:

fsutil file createnew file.name 0

Zero to rozmiar pliku w bajtach, więc jest to również przydatne do tworzenia dużych plików (nie będą one przydatne do testowania kompresji, ponieważ nie zawierają rzeczywistych danych i skompresują się do prawie niczego)

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

Na stronie http://xahlee.info/powershell/PowerShell dla_unixera.html sugeruje:

new-item -type file [filename]

i to rzeczywiście tworzy nowy plik o rozmiarze zero.

To nie wykonuje innej funkcji Unix touch, a mianowicie aktualizacji znacznika czasu, jeśli filename już istnieje, ale pytanie sugeruje, że użytkownik chce po prostu utworzyć plik o zerowym rozmiarze interaktywnie bez uciekania się do Notatnika.

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

Użyłem nazwy “Write-File”, ponieważ “Touch” nie jest zatwierdzonym czasownikiem PowerShell . Nadal jednak aliasuję go jako 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

Użycie:

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

Obsługuje:

  • ścieżki w innych katalogach
  • Credential dla ścieżek sieciowych
  • flagi Verbose, Debug i WhatIf
  • symbole wieloznaczne (tylko aktualizacja timestamp)