PowerShell: Tüm Metin Dosyası İçeriğini Değişkende Depolayın


118

Bir metin dosyasının tüm içeriğini (var olabilen veya bulunmayan sondaki boş satır dahil) bir değişkende depolamak için PowerShell'i kullanmak istiyorum . Metin dosyasındaki toplam satır sayısını da bilmek istiyorum. Bunu yapmanın en etkili yolu nedir?

Yanıtlar:


122

Bir dosyanın tüm içeriğini almak için:

$content = [IO.File]::ReadAllText(".\test.txt")

Satır sayısı:

([IO.File]::ReadAllLines(".\test.txt")).length

veya

(gc .\test.ps1).length

Sondaki boş satırı içerecek türden hack:

[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count

1
Teşekkürler! $content = [IO.File]::ReadAllText(".\test.txt")ile aynı şeyi yapıyor gibi görünüyor $content = (gc ".\test.txt" | out-string). İkisinin ikincisi daha kısa olduğu için tercih ettiğim şey bu. Ne yazık ki, toplam satır sayısını hesaplamak için sağladığınız yöntemlerin hiçbiri, sondaki boş satırları dikkate almıyor. Başka fikrin var mı?
Nick

@Nick .Net'te (ve pencerelerde), ile herhangi bir satır \r\nsayılacaktır.
manojlds

Biraz deney yapıyordum ve güncellenmiş cevabınızla aynı şeyi buldum, ancak yardımınız olmadan oraya varamazdım, bu yüzden çok teşekkür ederim!
Nick

Bunu şeffaf bir şekilde birleştirmenin bir yolu var mı Invoke-WebRequest?
Kareem

189

Bir yan not olarak, PowerShell 3.0'da Get-Contentcmdlet'i yeni Raw anahtarıyla kullanabilirsiniz:

$text = Get-Content .\file.txt -Raw 

3
Kabul edilen cevap bu olmalıdır. Bu arada, Get-Content'in daha önceki sürümlerde bile çalıştığından oldukça eminim.
MatteoSp

10
@ MatteoSp Get-Contentyaptı, ancak 3.0'a kadar elde edemedi -Raw. Bu olmadan, bir satır dizisi olarak saklanır.
jpmc26

Bu kesinlikle kabul edilen cevap olmalıdır. O yardımcı olmuyor belgeler söylüyor -Rawparametre şey yerli tarafından uygulanmadı.
Richard Szalay

Teşekkürler, bu şu anda çok yardımcı oldu.
DAhrens

24

Powershell 2.0:

(ayrıntılı açıklamaya buradan bakın)

$text = Get-Content $filePath | Out-String

IO.File.ReadAllTextO dosyayı arar, göreli bir yol ile benim için işe yaramadı %USERPROFILE%\$filePath(en azından Powershell İMKB'den çalıştırırken) yerine geçerli dizinin:

$text = [IO.File]::ReadAllText($filePath)

Powershell 3+:

$text = Get-Content $filePath -Raw

Akraba yollarını kullanmak için önce sorunu çözün, örneğin:[IO.File]::ReadAllText((Resolve-Path $filePath))
mvanle

13

Hoşlandığım bir dosyayı okumaya yönelik bir başka yaklaşım, çeşitli şekillerde değişken notasyon veya değişken sözdizimi olarak adlandırılır ve bir dosya spesifikasyonunu, başında dolar işareti bulunan küme parantezleri içine almayı içerir.

$content = ${C:file.txt}

Bu gösterim, bir L değeri veya bir R değeri olarak kullanılabilir ; böylece, bir dosyaya şöyle bir şeyle kolayca yazabilirsiniz:

 ${D:\path\to\file.txt} = $content

Başka bir kullanışlı kullanım, geçici bir dosya olmadan ve alt ifadeler olmadan bir dosyayı yerinde değiştirebilmenizdir, örneğin:

${C:file.txt} = ${C:file.txt} | select -skip 1

Başlangıçta bu gösterime hayran kaldım çünkü onunla ilgili bir şey bulmak çok zordu! PowerShell 2.0 spesifikasyonu bile, onu yalnızca bir kez kullanarak yalnızca bir satır gösterdiğinden bahsediyor - ancak hiçbir açıklama veya kullanım ayrıntıları olmadan. Daha sonra bu blog girişini PowerShell değişkenlerinde buldum ve bu da bazı iyi içgörüler sağlıyor.

Bunu kullanmayla ilgili son bir not: Bir sürücü tanımı kullanmalısınız, yani ${drive:filespec}yukarıdaki tüm örneklerde yaptığım gibi. Sürücü olmadan (örneğin ${file.txt}) çalışmaz. Bu sürücüdeki dosya spesifikasyonunda kısıtlama yoktur: mutlak veya göreceli olabilir.


Sürücü adından sonra ters eğik çizgi koymazsam bunu asla çalıştırmam.
Charles Anderson

@CharlesAnderson: Üç örnekten hangisine atıfta bulunduğunuz veya belki de hepsine atıfta bulunduğunuz açık değil ... Yine de, PowerShell V3'te 3'ün de göreceli bir yolla (yani ters eğik çizgi olmadan) çalıştığını doğruladım. Ayrıca, cevabım anında V2 kullanıyordum, bu yüzden belki de ortamınızda soruna neden olan başka bir şey vardır.
Michael Sorens

$ {C: \ file.txt} olarak yazmam gereken $ {C: file.txt} gibi örnekleri kastettim. Evet, çevremle ilgili bir şey olduğunu sanıyorum ama ne olduğu hakkında hiçbir fikrim yok.
Charles Anderson

L değeri olarak kullanıldığında, sistemin varsayılan kodlamasını kullanır. Etkisiz $ OutputEncoding ayarlamaya çalıştım. R değeri olarak kullanıldığında, bir dizi [] dizisi üretir.
robert4

Görünüşe göre sadece gerçek bir yol adı kullanabilirsiniz; bunun içinde bir değişken veya Yol Birleştirme ifadesi gibi bir şey kullanamazsınız. Bu can sıkıcı bir durum çünkü ConvertTo-Json üzerinden aktarıldığında, Get-Content ile karşılaştırıldığında dünya çapında bir fark var (ve $ {...} sonucu umduğum şeydi. Bunun aynı olup olmadığından emin değilim Get-Content olarak | Out-String gerçi
Cameron Kerr

2

Get-Content verileri alır ve satır satır bir diziye döker. Listelediğinizden başka özel gereksinimler olmadığını varsayarsak, içeriğinizi bir değişkene kaydedebilirsiniz.

$file = Get-Content c:\file\whatever.txt

Sadece çalıştırmak $filetüm içeriği döndürür. Ardından $file.Count, toplam satır sayısını elde etmek için (çünkü dizilerde zaten yerleşik bir sayma yöntemi vardır) yapabilirsiniz.

Bu yardımcı olur umarım! Ben bir komut dosyası sihirbazı değilim, ancak bu bana yukarıdaki birçok şeyden daha kolay göründü.

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.