Setara dengan Linux `touch` untuk membuat file kosong dengan PowerShell? [duplikat]

167

Pertanyaan ini sudah ada jawabannya di sini:

Di PowerShell apakah ada yang setara dengan touch?

Sebagai contoh di Linux saya dapat membuat file kosong baru dengan memohon:

touch filename

Di Windows ini cukup aneh - biasanya saya hanya membuka contoh baru notepad dan menyimpan file kosong.

Jadi apakah ada cara terprogram dalam PowerShell untuk melakukan ini?

Saya tidak mencari cara yang sama persis dengan perilaku sentuhan, tetapi hanya untuk menemukan padanan sesederhana mungkin untuk membuat file kosong.

jsalonen
sumber
Terima kasih. Saya melihat mereka, tetapi sebagian besar jawabannya berfokus pada command-prompt. Saya ingin memiliki solusi PowerShell yang tidak mengharuskan saya untuk menginstal aplikasi baru.
jsalonen
Turunkan pertanyaan - kedua fitur hanya beberapa baris kode lagi, cukup terapkan keduanya, bukan hanya setengahnya, esp. ketika setengah perintah lainnya hilang sangat berbahaya.
yzorg
@ yzorg: Apa yang Anda maksudkan dengan kedua fitur itu? Saya hanya bertanya bagaimana cara membuat file kosong di PS seperti yang dapat Anda lakukan dengan touchdi Linux.
jsalonen
@jsalonen Gunakan * nix touchpada file yang ada itu akan memperbarui waktu penulisan terakhir tanpa memodifikasi file, lihat tautan dari @amiregelz. Pertanyaan ini memiliki peringkat tinggi untuk google powershell touch, saya ingin mengingatkan copy / paste-ers bahwa hanya setengahnya saja yang dapat menghancurkan data, ketika * nix touch tidak. Lihat jawaban @LittleBoyLost yang menangani ketika file sudah ada.
yzorg

Jawaban:

165

Menggunakan redirector append ">>" menyelesaikan masalah di mana file yang ada dihapus:

echo $null >> filename
Yash Agarwal
sumber
3
Juga dikenal sebagai 'echo null> nama file' dari prompt perintah, mungkin file batch. Keren untuk melihat versi PowerShell-nya, terima kasih!
Mark Allen
16
sentuh agak berbeda dari ini jika file sudah ada
jk.
9
gema tidak perlu, $null > filenamebekerja dengan baik.
alirobe
8
Ini menulis 2 byte BOM 0xFEFF unicode untuk saya.
mlt
4
Catatan penting: Banyak alat unix tidak berurusan dengan BOM. Ini termasuk git misalnya (bahkan di windows). Anda akan mengalami masalah jika Anda menggunakan file yang dibuat dengan cara ini dengan alat yang tidak mengenali BOM. misalnya Anda mencoba membuat Anda .gitignoremenggunakan perintah ini dan bertanya-tanya mengapa itu tidak berhasil. BOM adalah alasannya.
martixy
96

Untuk membuat file kosong:

New-Item -ItemType file example.txt

Untuk memperbarui stempel waktu file:

(gci example.txt).LastWriteTime = Get-Date
dangph
sumber
4
Saya pikir ini adalah pendekatan terbaik!
Jayesh Bhoot
Apakah ini berfungsi untuk memperbarui stempel waktu folder?
riahc3
1
@ riahc3, gunakan ini: (gi MyFolder).LastWriteTime = Get-Date. Anda dapat menggunakannya untuk file juga.
dangph
9
Bahkan lebih bernas:ni example.txt
Nick Cox
2
Metode ini tidak menambahkan byte BOM yang mengerikan dan pengkodean dengan senang hati tampaknya menjadi UTF-8.
Davos
75

Berikut adalah versi yang membuat file baru jika tidak ada atau memperbarui timestamp jika memang ada.

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
    }
}
LittleBoyLost
sumber
4
Ini adalah jawaban yang tepat untuk mereplikasi program sentuh Unix (walaupun dengan nama yang berbeda), tetapi pertanyaannya adalah berorientasi hanya membuat file baru.
Jamie Schembri
15
Sangat, sangat kecil berdalih: Sementara Touch-File sesuai dengan konvensi penamaan Verb-Noun dari PS, Touchbukan kata kerja "yang disetujui" (bukan berarti itu persyaratan penting: msdn.microsoft.com/en-us/library/ms714428. aspx ). Filebaik-baik saja, btw. Saya merekomendasikan nama-nama Set-Fileatau Set-LastWriteTimeatau, favorit saya, Update-File. Juga, saya akan merekomendasikan Add-Content $file $nullbukannya echo $null > $file. Terakhir, atur alias dengan Set-Alias touch Update-Filejika Anda ingin tetap menggunakan perintahtouch
Alan McBee
Sarankan menambahkan ini sebagai baris terakhir:New-Alias -Name Touch Touch-File
stimpy77
25

Di PowerShell Anda dapat membuat fungsi Touch yang serupa seperti:

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

Pemakaian:

touch myfile.txt

Sumber

Ƭᴇcʜιᴇ007
sumber
Ini bagus, terima kasih! Apa yang saya inginkan! Adakah ide bagaimana saya dapat menginstal fungsi ini ke dalam PowerShell sehingga memuat secara otomatis ketika saya memulai shell?
jsalonen
2
Tambahkan ke file $ profil Anda. (Jalankan notepad $ profile untuk mengedit file itu.)
Mark Allen
25
Ini akan menghapus konten file jika ada.
dangph
1
Atau versi aman yang tidak menghapus konten file yang ada function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree
13

aku lebih memilih

fc > filename

untuk tugas ini. Untuk bekerja dengan file yang tidak kosong, Anda dapat menggunakan

fc >> filename

fchanyalah alias untuk Format-Kustom . Saya memilihnya karena itu adalah perintah singkat yang tidak melakukan apa pun dalam konteks ini, noop . Ini juga bagus karena jika Anda lupa pengalihan

fc filename

alih-alih memberi Anda kesalahan, sekali lagi itu tidak melakukan apa-apa. Beberapa alias lain yang akan berhasil adalah

ft -> Format-Table
fw -> Format-Wide
Steven Penny
sumber
9

Sudah ada banyak jawaban yang layak, tetapi saya cukup suka alias Item Baru yang hanya: ni

Anda juga dapat melupakan deklarasi tipe file (yang saya anggap implisit ketika ekstensi ditambahkan), jadi untuk membuat file javascript dengan nama 'x' di direktori saya saat ini, saya cukup menulis:

ni x.js

3 karakter lebih cepat daripada sentuhan!

Yakub E. Dawson
sumber
Ini bukan idempotenni : The file 'x.js' already exists
Steven Penny
8

Saya mengumpulkan berbagai sumber, dan berakhir dengan yang berikut, yang memenuhi kebutuhan saya. Saya perlu mengatur tanggal penulisan DLL yang dibangun pada mesin di zona waktu yang berbeda:

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

Tentu saja, Anda juga dapat mengaturnya untuk banyak file:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
John Saunders
sumber
1
+1 untuk cara Powershell-ish paling banyak untuk mengubah LastWriteTime pada file (yang saya butuhkan), meskipun pertanyaannya difokuskan pada fitur pembuatan file baru dari perintah sentuh.
Nathan Hartley
Tanpa menggunakan variabel?
riahc3
5

Buka file profil Anda:

notepad $profile

Tambahkan baris berikut:

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

Simpan dan muat ulang $ profil Anda untuk langsung menggunakannya. (Tidak perlu menutup dan membuka PowerShell)

. $profile

Untuk menambahkan file baru dalam jenis direktori saat ini:

touch testfile.txt

Untuk menambahkan file baru di dalam tipe direktori 'myfolder':

touch myfolder\testfile.txt

Jika file dengan nama yang sama sudah ada, maka file itu tidak akan terlalu berlebihan. Sebaliknya Anda akan mendapatkan kesalahan.

Saya harap ini membantu

Kiat bonus:

Anda dapat membuat yang setara dengan 'mkdir' dengan menambahkan baris berikut:

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

Penggunaan yang sama:

mkdir testfolder
mkdir testfolder\testsubfolder
RafaelGP
sumber
5
ac file.txt $null

Tidak akan menghapus konten file tetapi juga tidak memperbarui tanggal.

8DH
sumber
5

Sepertinya banyak jawaban di sini tidak memperhitungkan penyandian file.

Saya hanya mengalami masalah ini, karena berbagai alasan lain, tetapi

echo $null > $file

$null > $file

keduanya menghasilkan file UTF-16-LE, sementara

New-Item $file -type file

menghasilkan file UTF-8.

Untuk alasan apa pun fc > $filedan fc >> $file, tampaknya juga menghasilkan file UTF-8.

Out-File $file -encoding utf8

memberi Anda file UTF-8-BOM, sementara

Out-File $file -encoding ascii

memberi Anda file UTF-8. Pengkodean lain yang valid (tetapi belum diuji) yang didukung Out-File adalah: [[-Encoding] {unknown | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Anda juga dapat mem-pipe stuff ke Out-File untuk memberi file beberapa data teks untuk disimpan, dan juga flag-append. Sebagai contoh:

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

contoh ini tidak memperbarui stempel waktu karena alasan tertentu, tetapi yang ini:

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

Meskipun itu memang memiliki efek samping menambahkan "foo" ke akhir file.

Jika Anda tidak yakin tentang apa pengkodean yang Anda miliki, saya telah menemukan VS-Code memiliki fitur bagus di mana di sudut kanan bawah ia mengatakan apa itu pengkodean. Saya pikir Notepad ++ juga memiliki fitur serupa.

Garret Hoffman
sumber
Set-Content -Path $file -value $nullmelakukan pekerjaan dan itu tidak mempengaruhi pengodean file. Periksa juga versi ss64 daritouch .
Anton Krouglov
3

Untuk skenario yang Anda jelaskan (ketika file tidak ada), ini cepat dan mudah:

PS> sc example.txt $null

Namun, penggunaan umum lainnya touchadalah untuk memperbarui stempel waktu file. Jika Anda mencoba menggunakan sccontoh saya seperti itu, itu akan menghapus isi file.

Jay Bazuzi
sumber
1
Terima kasih! Apa scartinya Sunting: mengetahuinya ("Setel Konten")
jsalonen
2

untuk membuat file kosong di windows, cara puasa adalah sebagai berikut:

fsutil file createnew file.name 0

Yang nol adalah filesize dalam byte, jadi ini juga berguna untuk membuat file besar (mereka tidak akan berguna untuk menguji kompresi karena mereka tidak mengandung data aktual dan akan memampatkan ke apa-apa)

Jon Carlstedt
sumber
2

Laman web http://xahlee.info/powershell/PowerShell_for_unixer.html menyarankan:

new-item -type file [filename]

dan ini memang membuat file baru berukuran nol.

Ini tidak melakukan fungsi lain dari Unix touch, yaitu untuk memperbarui cap waktu jika nama file sudah ada, tetapi pertanyaannya menyiratkan bahwa pengguna hanya ingin membuat file berukuran nol secara interaktif tanpa menggunakan Notepad.

ghostarbeiter
sumber
1

Saya menggunakan nama "Write-File" karena "Sentuh" ​​bukan kata kerja PowerShell yang disetujui . Namun saya masih menyebutnya sebagai sentuhan.

Sentuh.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

Pemakaian:

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

Mendukung:

  • Jalan di direktori lain
  • Credential untuk jalur jaringan
  • Verbose,, Debugdan WhatIfbendera
  • wildcard (hanya pembaruan cap waktu)
kesalahan
sumber
The New-Itemperintah telah ditawarkan dalam empat jawaban sebelumnya. Anda telah menyediakan pembungkus 20-baris untuk itu. Bisakah Anda menjelaskan sedikit lebih jelas apa manfaat solusi Anda daripada yang sebelumnya? Sebagai contoh, apa ini Verbose, Debugdan WhatIfbendera, dll?
Scott
Satu perbedaan penting antara jawaban ini dan New-Itemini memperbarui cap waktu file yang ada.
jpaugh