PowerShell Set İçeriği ve Dosya Dışı - fark nedir?


Yanıtlar:


96

PowerShell ile birkaç aylık deneyimim ve bazı bilimsel deneyimlerden sonra çıkardıklarımın bir özeti burada. Bunların hiçbirini belgelerde bulamadım :(

[ Güncelleme: Bunun çoğu artık daha iyi belgelenmiş gibi görünüyor.]

Okuma ve yazma kilitleme

Çalışırken Out-Filebaşka bir uygulama günlük dosyasını okuyabilir.

Çalışırken Set-Content, diğer uygulamalar günlük dosyasını okuyamaz. Bu nedenle aslaSet-Content uzun süre çalışan komutları günlüğe kaydetmek için kullanmayın .

Kodlama

Out-Filevarsayılan olarak Unicode( UTF-16LE) kodlamasına kaydeder (ancak bu belirtilebilir), oysa PowerShell 3+ ' Set-Contentde ASCII( US-ASCII) varsayılan olarak (bu da belirtilebilir). Önceki PowerShell sürümlerinde, Set-Contentiçeriği Default(ANSI) kodlamasında yazıyordu .

Editörün notu : PowerShell sürüm 5.1 itibariyle halen kültür özele varsayılan Default( "ANSI") kodlayan, hangi belgelerin iddialarına rağmen. ASCII varsayılan ise, değişmez değereü dönüştürülecek gibi ASCII olmayan karakterler , ancak durum böyle değil : verim . ?'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'$False

PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt

Bu, iki komutun varsayılan değerlerinin uyumsuz olduğu ve bunları karıştırmanın metni bozacağı anlamına gelir, bu nedenle her zaman bir kodlama belirtin.

Biçimlendirme

Bartek'in açıkladığı gibi, Out-Fileçıktının süslü biçimlendirmesini terminalde görüldüğü gibi kaydeder. Yani iki dosya içeren bir klasörde komut dir | out-file out.txt11 satırlık bir dosya oluşturur.

Oysa Set-Contentdaha basit bir gösterimi kaydeder. İki dosya içeren bu klasörde, komut dir | set-content sc.txtiki satırlı bir dosya oluşturur. Terminaldeki çıktıya öykünmek için:

PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt

Bu biçimlendirmenin satır sonları için bir sonucu olduğuna inanıyorum, ancak bunu henüz açıklayamıyorum.

Dosya oluşturma

Set-Contentgüvenilir bir şekilde boş bir dosya oluşturmaz Out-File:

Komut boş bir klasörde dir | out-file out.txtbir dosya oluştururken oluşturmaz dir | set-content sc.txt.

Boru Hattı Değişkeni

Set-Contentdosya adını boru hattından alır; bir dizi dosyanın içeriğini sabit bir değere ayarlamanıza izin verir.

Out-Fileverileri boru hattından olduğu gibi alır; tek bir dosyanın içeriğini güncelleme.

Parametreler

Set-Content aşağıdaki ek parametreleri içerir:

  • Hariç tut
  • Filtrele
  • Dahil etmek
  • PassThru
  • Akış
  • Kullanım İşlemi

Out-File aşağıdaki ek parametreleri içerir:

  • Ekle
  • NoClobber
  • Genişlik

Bu parametrelerin ne olduğu hakkında daha fazla bilgi için lütfen yardıma bakın; ör get-help out-file -parameter append.


4
Set-Contentvarsayılan kodlama: çevrildi (Get-Culture).Textinfo.ANSICodePage(Windows 8.1, Powershell 4.0, CurrentCulture cs-CZ, CurrentUICulture en-GB, ANSICodePage 1250, OEMCodePage 852, 'řž'yukarıdaki kod sayfalarında farklı kodlarla dize kullanılarak test edilmiştir ).
JosefZ

Ayrıca Out-Filebelirli durumlarda uzun kuyruklarda sorun yaşandığını unutmayın . Örneğin: $x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt.
Bacon Bits

17

Out-File-NoClobberve / veya -Appendbayrak ayarlanmadıkça çıktı yolunun üzerine yazma davranışına sahiptir . Add-Contentçıktı yolu varsayılan olarak zaten mevcutsa (yapabiliyorsa) içerik ekleyecektir. Zaten mevcut değilse, her ikisi de dosyayı oluşturur.

Bir başka ilginç fark, Add-Contentvarsayılan olarak ASCII kodlu bir dosya Out-Fileoluşturması ve varsayılan olarak küçük bir endian unicode kodlu dosya oluşturmasıdır.

>olan bir takma için sözdizimsel şeker Out-File. Bu var Out-Filebazı önceden tanımlanmış parametre ayarları ile.


Teşekkürler, kodlama farklılıklarını bilmek faydalıdır. Eğer yaparsanız, çok haklı değiliz echo "" > $null | Add-Content abc.txto gelmez dosyası oluşturmak abc.txtdışı Dosya olur oysa.
Albay Panic

@MattHickford Bu biraz garip bir durum örneği. Bu kod $ null'a aktarılır, böylece Add-Contenthiçbir şey almaz. Eğer Add-Contentbu bir dosya oluşturmak neden hiçbir şey almaz? Öte yandan aynı soru Dosya Dışı için de sorulabilir.
Andy Arismendi

Fark benim için gci $folder | Out-File log.txt ; cat log.txtişe yarıyor, ama gci $folder | Add-Content log.txt ; cat log.txtpatlıyor
Albay Panic

@MattHickford Dosyayı işlemeyi denemeden önce muhtemelen var olduğundan emin olurdum. Muhtemelen tüm diller için iyi bir alışkanlık.
Andy Arismendi

Diğer bir fark ise Set-Content, dosya kullanılırken diğer uygulamalar tarafından kullanılamamasıdır.
Albay Panic

10

Ben katılmıyorum ... :)

  1. Out-File, Add-Content olacak -Append (üzerine yazmayı önlemek için -NoClober vardır) içerir. Ama bu aynı canavar değil.
  2. komut | Add-Content, girişte .ToString () yöntemini kullanacaktır. Out-File varsayılan biçimlendirmeyi kullanır.

yani:

ls | Add-Content test.txt

ve

ls | Out-File test.txt

size tamamen farklı sonuçlar verecektir.

Ve hayır, '>' diğer ad değil, yeniden yönlendirme operatörüdür (diğer kabuklarda olduğu gibi). Ve çok ciddi sınırlamaları var ... Çizgileri görüntülendikleri gibi kesecek. Out-File, bundan kaçınmanıza yardımcı olan -Width parametresine sahiptir. Ayrıca, yeniden yönlendirme operatörleri ile hangi kodlamanın kullanılacağına karar veremezsiniz.

HTH Bartek


3
>Dosya Dışı ile aynı anlama gelen bir takma addır. Aynı şifre diyorlar. Bruce Payette'in PowerShell in Action Second Edition'dan (Kindle Locations 4646):In fact, myScript > file.txt is just “syntactic sugar” for myScript | out-file -path file.txt In some cases, you’ll want to use Out-File directly because it gives you more control over the way the output is written.
Andy Arismendi 18'12

1
Varsayılan biçimlendirme (Dosya Dışı) ile ToString (İçerik Ekle) karşılaştırması hakkında iyi bir nokta
Andy Arismendi

Demek istediğim şuydu: her ikisi de genel olarak aynı şeyi yapsa da, takma adın PowerShell'de anlamı vardır ... bu yüzden bu terimi bunlar arasındaki ilişkiyi tanımlamak için de kullanmazdım ..;) Alias ​​komutun yerini alır, bu durumda sözdizimi yapmalıdır : ls | > file.txt mümkün. Açıkçası işe yaramayacak ...
BartekB

1
Varsayılan biçimlendirme, verilen nesnenin konsolda sunulma şeklidir. Temel cmdlet'lerin / nesne türlerinin çoğu, PowerShell'e bunları kullanıcı dostu bir şekilde nasıl görüntüleyeceğini bildiren biçimlendirme meta verilerine sahiptir. Başka bir deyişle: Komutun Çıkış Dosyasına yöneltme sonuçları, PowerShell tarafından yapılan biçimlendirmeyi kaybetmeden komut çıktısını dosyaya kaydetmek için kullanılabilir.
BartekB

2
Evet, bunun >tam olarak eşdeğeri olmayan önemli bir ayrım olduğunu düşünüyorum out-file. Eğer ayarlarsanız $PSDefaultParameterValues["Out-File:Encoding"] = "UTF8", tarafından yok sayılacaktır >.
wisbucky

3

Set-Contentdestekleri -Encoding Byte, süre Out-Fileyok.

Bu yüzden Text.Encoding#GetBytes()bir dosyaya ikili veri veya sonucunu yazmak istediğinizde kullanmalısınız Set-Content.


0

Out-file -append veya ">>" aslında aynı dosyada iki kodlamayı karıştırabilir. Dosya orijinal olarak ascii veya ansi olsa bile, varsayılan olarak alt kısmına unicode ekler. Ek içerik, kodlamayı kontrol edecek ve eklemeden önce eşleştirecektir. Btw, export-csv varsayılan olarak ascii (aksan yok) ve set-content / add-content için ansi.


0

Kodlamadaki farklılık hakkında eklemek istedik:

PowerShell 5.1 yüklü Windows:

  • Dosya Dışı - Varsayılan kodlama utf-16le'dir
  • Set İçeriği - Varsayılan kodlama us-ascii'dir

PowerShell 7.1 ile Linux:

  • Out-File - Varsayılan kodlama us-ascii'dir
  • Set İçeriği - Varsayılan kodlama us-ascii'dir
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.