Linux `touch` ın eşdeğeri PowerShell ile boş bir dosya oluşturmak için? [çift]


167

Bu sorunun burada zaten bir cevabı var:

PowerShell'de buna eşdeğer bir var touchmı?

Örneğin Linux'ta şunu çağırarak yeni bir boş dosya oluşturabilirim:

touch filename

Windows'ta bu oldukça garip - genellikle yeni bir not defteri örneğini açıyorum ve boş bir dosya kaydetiyorum.

Peki PowerShell'de bunu yapmanın programlı bir yolu var mı?

Dokunma davranışını tam olarak eşleştirmek istemiyorum, sadece boş dosyalar oluşturmak için mümkün olan en basit eşdeğeri bulmak için.



Teşekkürler. Onlara baktım, ancak cevabın çoğu komut istemine odaklandı. Yeni uygulamalar yüklememi gerektirmeyen bir PowerShell çözümüne sahip olmak istiyorum.
jsalonen

Soruyu reddetti - her iki özellik de yalnızca birkaç kod satırı, sadece ikisini birden uygular, esp. eksik olan diğer yarı komut ise çok tehlikeli.
yzorg

@yzorg: Her iki özellik de ne demek istiyorsun? Sadece PS'de touchLinux'ta nasıl yapabildiğiniz gibi nasıl boş bir dosya oluşturulacağını soruyordum .
jsalonen

@jsalonen touchMevcut bir dosyada * nix dosyasını kullanın , dosyayı değiştirmeden son yazma zamanını güncelleyin, @amiregelz'deki bağlantılara bakın. Bu soru için yüksek bir Google sıralaması var powershell touch, kopyaların / yapıştırıcıların sadece bu yarısının verileri yok edebileceğini, * nix touch'ın yapmadığı zaman uyarmak istedim. Dosya zaten var olduğunda işleyen @LittleBoyLost yanıtına bakın.
yzorg

Yanıtlar:


165

">" Ekleme yönlendiricisini kullanmak, mevcut bir dosyanın silinmesi sorununu çözer:

echo $null >> filename

3
Komut isteminde 'echo null> dosyaadı' olarak da bilinir, muhtemelen bir toplu iş dosyasıdır. PowerShell sürümünü görmek için harika, teşekkürler!
Mark Allen,

16
dosya zaten mevcutsa, touch bundan çok farklıdır
jk.

9
yankı gereksiz, $null > filenameharika çalışıyor.
alirobe

8
Bu benim için 2 bayt unicode ürün reçetesi 0xFEFF yazar.
mlt

4
Önemli not: Birçok unix aracı malzeme listesiyle ilgilenmez. Bu, örneğin git (pencerelerde bile) içerir. Malzeme Listesini tanımayan araçlarla bu şekilde oluşturulan dosyaları kullanırsanız sorun yaşayacaksınız. Örneğin, .gitignorebu komutu kullanarak yaratmayı deniyor ve neden işe yaramayacağını merak ediyorsunuz. BOM nedenidir.
martixy

96

Boş bir dosya oluşturmak için:

New-Item -ItemType file example.txt

Bir dosyanın zaman damgasını güncellemek için:

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

4
Bence bu en iyi yaklaşım!
Jayesh Bhoot,

Bu, bir klasörün zaman damgasını güncellemek için çalışır mı?
riahc3

1
@ riahc3 bu kullanımı: (gi MyFolder).LastWriteTime = Get-Date. Bunu dosyalar için de kullanabilirsiniz.
dangph

9
Daha da özlü:ni example.txt
Nick Cox

2
Bu yöntem korkunç BOM baytları eklemiyor ve kodlama UTF-8 gibi görünüyor.
Davos

75

İşte yoksa, yeni bir dosya oluşturan ya da varsa zaman damgasını güncelleyen bir sürüm.

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
Bu, Unix dokunma programını (farklı bir isimle de olsa) çoğaltmak için doğru cevaptır, ancak soru basit bir şekilde yeni bir dosya oluşturmaya yöneliktir.
Jamie Schembri

14
Çok, çok küçük bir kelime oyunu: Touch-File, PS'in Fiil-İsim isimlendirme kurallarına uygun olsa da, Touch"onaylanmış" bir fiil değildir (önemli bir gereklilik değildir: msdn.microsoft.com/en-us/library/ms714428. aspx ). Fileiyi, btw. İsimleri Set-Fileveya Set-LastWriteTimeveya favorilerimi öneririm Update-File. Ayrıca, Add-Content $file $nullyerine tavsiye ederim echo $null > $file. Sonunda, Set-Alias touch Update-Filekomutu kullanmaya devam etmek istiyorsanız takma adı ayarlayıntouch
Alan McBee

Bunu son satır olarak eklemenizi önerin:New-Alias -Name Touch Touch-File
stimpy77

25

PowerShell'de benzer bir Dokunma işlevi oluşturabilirsiniz:

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

Kullanımı:

touch myfile.txt

Kaynak


Bu harika, teşekkürler! Tam istediğim şey! Bu işlevi PowerShell'e nasıl yükleyebileceğime dair bir fikrim var, böylece kabuğu başlattığımda otomatik olarak yüklenecek mi?
jsalonen

2
$ Profil dosyanıza ekleyin. (Bu dosyayı düzenlemek için $ notepad komutunu çalıştırın.)
Mark Allen

25
Bu, varsa dosyanın içeriğini silecektir.
dangph

1
Veya varolan dosya içeriğini temizlemeyen güvenli sürüm function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree

13

tercih ederim

fc > filename

bu görev için. Boş olmayan dosyalarla çalışmak için kullanabilirsiniz

fc >> filename

fcsadece Format-Custom için bir takma addır . Onu seçtim çünkü bu bağlamda hiçbir şey yapmayan kısa bir komut, bir noop . Aynı zamanda güzel çünkü yönlendirmeyi unutursanız

fc filename

sana bir hata vermek yerine, yine hiçbir şey yapmaz. İşe yarayacak diğer bazı takma adlar

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

9

Halihazırda pek çok değerli cevap var, ancak New-Item'in takma adlarından çok hoşlandım.

Ayrıca dosya türü bildirimini (uzantı eklendiğinde örtük olduğunu varsayarsak) bırakabilirsiniz, bu nedenle şu anki dizimde 'x' ismiyle bir javascript dosyası oluşturabilirim:

ni x.js

Dokunmadan daha hızlı 3 karakter!


Bu iddiasız değilni : The file 'x.js' already exists
Steven Penny

8

Çeşitli kaynakları bir araya getirdim ve ihtiyaçlarımı karşılayan aşağıdakilerle yatarım. Bir makinede oluşturulmuş bir DLL dosyasının tarihini farklı bir saat diliminde ayarlamam gerekiyordu:

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

Tabii ki, birden fazla dosya için de ayarlayabilirsiniz:

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

1
Bir dokunuşta yeni dosya oluşturma özelliğine odaklanılmış soru olmasına rağmen, bir dosyadaki LastWriteTime'ı değiştirmenin en Powershell-ish yolu için +1.
Nathan Hartley,

Bir değişken kullanmadan mı?
riahc3,

5

Profil dosyanızı açın:

notepad $profile

Aşağıdaki satırı ekleyin:

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

Hemen kullanabilmek için kaydet ve $ profilini yeniden yükle. (Powershell'i kapatmaya ve açmaya gerek yok)

. $profile

Geçerli dizine yeni bir dosya eklemek için:

touch testfile.txt

'Myfolder' dizinine yeni bir dosya eklemek için:

touch myfolder\testfile.txt

Aynı ada sahip bir dosya zaten varsa, overidden olmayacak. Bunun yerine bir hata alırsınız.

Umut ediyorum bu yardım eder

Bonus ipucu:

Aşağıdaki satırı ekleyerek 'mkdir' eşdeğerini yapabilirsiniz:

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

Aynı kullanım:

mkdir testfolder
mkdir testfolder\testsubfolder

5
ac file.txt $null

Dosya içeriğini silmez, ancak tarihi de güncellemez.


5

Buradaki cevapların birçoğu dosya kodlamasını hesaba katmıyor gibi görünüyor.

Diğer sorunlardan dolayı sadece bu problemle karşılaştım, fakat

echo $null > $file

$null > $file

her ikisi de bir UTF-16-LE dosyası oluştururken

New-Item $file -type file

bir UTF-8 dosyası üretir.

Sebebi ne olursa olsun fc > $fileve fc >> $fileayrıca UTF-8 dosyaları üretmek gibi görünüyor.

Out-File $file -encoding utf8

size bir UTF-8-BOM dosyası verirken

Out-File $file -encoding ascii

size bir UTF-8 dosyası verir. Out-File'ın desteklediği diğer geçerli (ancak denenmemiş) kodlamalar şunlardır: [[-Encoding] {unknown | dize | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | varsayılan | oem}]. Ayrıca, dosyaya depolanacak bazı metin verilerini ve ayrıca bir -append bayrağını vermek için dosyaları Out-File'a yönlendirebilirsiniz. Örneğin:

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

bu örnek, bir nedenden dolayı zaman damgasını güncellemiyor, ancak bu,

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

Her ne kadar dosyanın sonuna "foo" eklemenin yan etkisi olsa da.

Hangi kodlamaya sahip olduğunuzdan emin değilseniz, VS Kodunun sağ alt köşesinde kodlamanın ne olduğunu söylediği şık bir özellik olduğunu gördüm. Notepad ++ 'ın da benzer bir özelliği olduğunu düşünüyorum.


Set-Content -Path $file -value $nullişi yapar ve dosya kodlamasını etkilemez. Ayrıca ss64 sürümünütouch de kontrol edin .
Anton Krouglov,

3

Tanımladığınız senaryo için (dosya yoksa), bu hızlı ve kolaydır:

PS> sc example.txt $null

Ancak, diğer ortak kullanım touchdosyasının zaman damgasını güncellemektir. scÖrneğimi bu şekilde kullanmaya çalışırsanız , dosyanın içeriği silinir.


1
Teşekkürler! Ne scdemek istiyorsun? Düzenleme: anladım ("İçerik Ayarla")
jsalonen

2

pencerelerde boş bir dosya oluşturmak için en hızlı yol aşağıdaki gibidir:

fsutil file createnew file.name 0

Sıfır, bayt cinsinden dosya boyutudur, bu nedenle büyük dosyalar oluşturmak için de yararlıdır (gerçek veri içermediklerinden ve hemen hemen hiçbir şey için sıkışmadıklarından, sıkıştırmayı test etmek için yararlı olmayacaklardır)


2

Http://xahlee.info/powershell/PowerShell_for_unixer.html web sayfası şunları önermektedir:

new-item -type file [filename]

ve bu gerçekten de sıfır boyutunda yeni bir dosya oluşturuyor.

Bu, Unix'in diğer işlevini yerine getirmiyor touch, yani dosya adı zaten mevcutsa zaman damgasını güncellemek , ancak soru kullanıcının sadece Not Defteri'ne başvurmadan etkileşimli olarak sıfır boyutlu bir dosya oluşturmak istediği anlamına geliyor.


1

"Yazma Dosyası" adını kullandım çünkü "Dokunma" onaylanmış bir PowerShell fiili değil . Ancak, yine de dokunuş olarak takma adıyorum.

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

Kullanımı:

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

destekler:

  • Diğer dizinlerdeki yollar
  • Credential ağ yolları için
  • Verbose, Debugve WhatIfbayraklar
  • joker karakterler (yalnızca zaman damgası güncelleştirmesi)

New-ItemKomut önceki dört cevaplar sunulan edilmiştir. Bunun için 20 satırlık bir sarıcı sağladınız. Çözümünüzün öncekiler üzerindeki avantajını biraz daha net bir şekilde açıklayabilir misiniz? Örneğin, bunlar ne Verbose, Debugve WhatIfbayraklar vb?
Scott

Bu yanıtla arasındaki önemli bir fark New-Item, bunun mevcut dosyaların zaman damgasını güncellemesidir.
jpaugh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.