PowerShell:テキストファイル全体の内容を変数に保存する


118

PowerShellを使用して、テキストファイルの内容全体(存在する場合と存在しない場合がある末尾の空白行を含む)を変数に格納したいと考えています。テキストファイルの合計行数も知りたいのですが。これを行う最も効率的な方法は何ですか?

回答:


122

ファイルの内容全体を取得するには:

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

行数:

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

または

(gc .\test.ps1).length

後続の空行を含めるためのハックのようなもの:

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

1
ありがとう!$content = [IO.File]::ReadAllText(".\test.txt")と同じことをするよう$content = (gc ".\test.txt" | out-string)です。2つのうち2つ目は短いので、それが私の好みです。残念ながら、行の総数を計算するために提供した方法のどちらも、末尾の空白行を考慮に入れていません。他のアイデアはありますか?
Nick

@Nick .Net(およびウィンドウ)では、次の行\r\nがカウントされます。
manojlds

私はいくつかの実験を行っていて、あなたの更新された答えと同じことを思いつきましたが、あなたの助けがなければ私はそこにたどり着くことはなかったでしょう。
Nick

これを透過的に組み合わせる方法はありInvoke-WebRequestますか?
カリーム2017年

189

余談ですが、PowerShell 3.0ではGet-Content、新しいRawスイッチでコマンドレットを使用できます。

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

3
これは受け入れられる答えです。ちなみに、Get-Contentは以前のバージョンでも動作すると確信しています。
MatteoSp

10
@MatteoSp Get-Contentはそうしましたが、3.0になるまでは得られませんでした-Raw。それがなければ、それは行の配列として保存されます。
jpmc26 2016年

これは絶対に受け入れられる答えです。それは、ドキュメント-Rawパラメーターがネイティブによって実装されていないことを言っていることを助けません。
Richard Szalay

おかげで、これは今のところ大きな助けになりました。
ダレンス

24

Powershell 2.0:

(詳細な説明はこちら)

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

IO.File.ReadAllTextそれは、ファイルを探し、相対パスで私のために動作しませんでした%USERPROFILE%\$filePath(少なくとも、PowerShellのISEから実行している場合)の代わりにカレントディレクトリの:

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

Powershell 3以降:

$text = Get-Content $filePath -Raw

相対パスを使用するには、まずそれを解決します。例:[IO.File]::ReadAllText((Resolve-Path $filePath))
mvanle

13

私がたまたま好きなファイルを読み取るもう1つの方法は、変数表記または変数構文と呼ばれ、ドル記号が前に付いた中括弧でファイル指定を囲むだけです。

$content = ${C:file.txt}

この表記は、L値またはR値として使用できます。したがって、次のようなものを使用してファイルに簡単に書き込むことができます。

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

もう1つの便利な使用法は、一時ファイルやサブ式なしでファイルを適切に変更できることです。次に例を示します。

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

何かを見つけるのがとても難しかったので、最初はこの表記に魅了されました!PowerShell 2.0仕様でさえ、それを使用している1行だけを一度だけ示していますが、使用の説明や詳細はありません。その後、PowerShell変数に関するこのブログエントリを見つけました。

これを使用する上での最後の注意:ドライブ指定を使用する必要があります。つまり${drive:filespec}、上記のすべての例で行ったように。ドライブ(例:)${file.txt}がないと動作しません。そのドライブのファイル指定に制限はありません。それは絶対的または相対的なものです。


ドライブ名の後にバックスラッシュを付けない限り、これが機能することはありません。
チャールズアンダーソン

@CharlesAnderson:3つの例のうちどれを参照しているのか、あるいはすべてを参照しているのかは明らかではありません...それでも、PowerShell V3では、3つすべてが相対パス(つまり、バックスラッシュなし)で動作することを確認しました。さらに、私の回答の時点では、私はV2を使用していたので、おそらく他の何かが環境で問題を引き起こしているのでしょう。
Michael Sorens 2013年

$ {C:\ file.txt}のように記述する必要がある$ {C:file.txt}のような例を意味しました。はい、私はそれが私の環境についての何かであると思いますが、私は何がわかりません。
チャールズアンダーソン

L値として使用する場合、システムのデフォルトのエンコーディングを使用します。何の効果もなく$ OutputEncodingを設定しようとしました。R値として使用すると、string []配列が生成されます。
robert4 2013

リテラルパス名しか使用できないようです。この中で変数やJoin-Path式のようなものは使用できません。ConvertTo-Jsonを介してパイプされると、Get-Contentと比較して世界に違いがあるため、これは厄介です。 Get-Contentとして| Out-Stringでも
Cameron Kerr

2

Get-Contentはデータを取得し、1行ずつ配列にダンプします。あなたがリストしたもの以外に特別な要件がないと仮定すると、コンテンツを変数に保存できますか?

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

実行する$fileと、コンテンツ全体が返されます。次に、$file.Count(配列にはすでにcountメソッドが組み込まれているため)行の総数を取得するだけです。

お役に立てれば!私はスクリプティングの専門家ではありませんが、これは上記の多くのものより簡単に思えました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.