PowerShell Set-ContentとOut-File-違いは何ですか?


回答:


94

これは、PowerShellの数か月の経験といくつかの科学的実験の後で、私が推測したことの要約です。私はドキュメントでこれを見つけたことがありません:(

[更新:これの多くは、より適切に文書化されているように見えます。]

読み取りおよび書き込みロック

Out-File実行中に、別のアプリケーションがログファイルを読み取ることができます。

Set-Content実行中、他のアプリケーションはログファイルを読み取ることができません。したがって、長時間実行されるコマンドのログに使用Set-Contentないでください

エンコーディング

Out-FileデフォルトではUnicodeUTF-16LE)エンコーディングで保存されますが(これは指定できます)、PowerShell 3+ではSet-ContentデフォルトでASCIIUS-ASCII)になります(これも指定できます)。以前のPowerShellバージョンでSet-Contentは、コンテンツをDefault(ANSI)エンコーディングで記​​述していました。

編集者注:PowerShellのバージョン5.1のように静止カルチャ固有のデフォルトDefault(「ANSI」)をコードする、どのようなドキュメントの主張にもかかわらず。ASCIIがデフォルトの場合、のような非ASCII文字はリテラルü変換されますが、そうではありません:yields 。 ?'ü' | 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

つまり、2つのコマンドのデフォルトには互換性がなく、それらを混在させるとテキストが破損するため、常にエンコーディングを指定してください。

フォーマット

Bartekが説明したようOut-Fileに、ターミナルで見られるように、出力の凝ったフォーマットを保存します。したがって、2つのファイルがあるフォルダーに、コマンドdir | out-file out.txtは11行のファイルを作成します。

一方Set-Content、より単純な表現を保存します。2つのファイルがあるそのフォルダーに、コマンドdir | set-content sc.txtは2行のファイルを作成します。ターミナルで出力をエミュレートするには:

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

このフォーマットは改行に影響すると思いますが、まだ説明できません。

ファイルの作成

Set-Content次の場合、空のファイルを確実に作成しませんOut-File

空のフォルダーでは、コマンドdir | out-file out.txtはファイルを作成しますが、作成しdir | set-content sc.txtません。

パイプライン変数

Set-Contentパイプラインからファイル名を取得します。いくつかのファイルの内容を固定値に設定できます。

Out-Fileパイプラインからデータを取得します。単一のファイルのコンテンツを更新します。

パラメーター

Set-Content 次の追加パラメータが含まれます。

  • 除外する
  • フィルタ
  • 含める
  • パススルー
  • ストリーム
  • UseTransaction

Out-File 次の追加パラメータが含まれます。

  • 追加する
  • NoClobber

これらのパラメータの詳細については、ヘルプを参照してください。例:get-help out-file -parameter append


4
Set-Contentデフォルトのエンコーディング:に変換されます(Get-Culture).Textinfo.ANSICodePage(Windows 8.1、cs-CZPowershell 4.0、CurrentCulture 、CurrentUICulture en-GB、ANSICodePage 1250、OEMCodePage 852'řž'上記のコードページで異なるコードの文字列を使用してテスト済み)。
JosefZ 2016年

またOut-File、特定の状況では長い行に問題があることに注意してください。例: $x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
ベーコンビット

17

Out-File-NoClobberおよび/または-Appendフラグが設定されていない限り、出力パスを上書きする動作があります。Add-Contentデフォルトで出力パスがすでに存在する場合(可能な場合)、コンテンツを追加します。どちらかがまだ存在しない場合は、両方がファイルを作成します。

もう1つの興味深い違いは、Add-ContentデフォルトでASCIIエンコードファイルOut-Fileを作成し、デフォルトでリトルエンディアンのユニコードエンコードファイルを作成することです。

>ある別名のための糖衣構文Out-File。それはだOut-File、いくつかの事前定義されたパラメータ設定で。


おかげで、エンコーディングの違いを知ることは役に立ちます。あなたは完全に正しくありません。そうするとファイル作成さecho "" > $null | Add-Content abc.txtませんがabc.txt、Out-Fileは作成されます。
パニック大佐2012年

@MattHickfordそれはちょっと奇妙なケースの例です。そのコードは$ nullにパイプされるためAdd-Content、何も受け取りません。Add-Content何も受け取らない場合、なぜファイルを作成する必要があるのですか?一方、Out-Fileについても同じ質問をすることができます。
Andy Arismendi 2012年

違いは私にとって重要ですgci $folder | Out-File log.txt ; cat log.txtが、gci $folder | Add-Content log.txt ; cat log.txt爆破します
パニック大佐

@MattHickfordおそらく、ファイルを処理する前に、ファイルが存在することを確認します。おそらくすべての言語にとって良い習慣です。
Andy Arismendi 2012年

もう1つの違いは、Set-Content使用中はファイルを他のアプリケーションで使用できないことです。
パニック大佐

10

まあ、私は同意しません... :)

  1. Out-Fileには、Add-Contentを追加する-Append(-NoCloberは上書きを避けるためにあります)があります。しかし、これは同じ獣ではありません。
  2. コマンド| Add-Contentは、入力時に.ToString()メソッドを使用します。Out-Fileはデフォルトのフォーマットを使用します。

そう:

ls | Add-Content test.txt

そして

ls | Out-File test.txt

まったく異なる結果が得られます。

いいえ、「>」はエイリアスではなく、リダイレクト演算子です(他のシェルと同じです)。そして、非常に深刻な制限があります...それはそれらが表示されるのと同じ方法で線をカットします。Out-Fileには、これを回避するのに役立つ-Widthパラメーターがあります。また、リダイレクト演算子を使用すると、使用するエンコーディングを決定できません。

HTH Bartek


3
これは、>とOut-Fileが同じものであるという意味でのエイリアスです。彼らは同じコードを呼び出します。BrucePayetteのPowerShellin Action Second Edition(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

1
デフォルトのフォーマット(Out-File)とToString(Add-Content)の良い点
Andy Arismendi 2012年

私のポイントは、どちらもほぼ同じですが、PowerShellではエイリアスの意味があります...したがって、これらの関係を説明するためにこの用語を使用することはありません。;)エイリアスはコマンドを置き換えます。この場合、構文を作成する必要があります。 :ls | > file.txtが可能です。明らかに、それは機能しません...
BartekB 2012年

1
デフォルトのフォーマットは、指定されたオブジェクトがコンソールに表示される方法です。ほとんどのコアコマンドレット/オブジェクトタイプには、PowerShellにユーザーフレンドリーな方法でそれらを表示する方法を通知するフォーマットメタデータがあります。つまり、コマンドの結果をOut-Fileにパイプ処理することで、PowerShellによって実行された書式設定を失うことなく、コマンドの出力をファイルに保存できます。
BartekB 2014年

2
はい、それ>out-file。と完全に同等ではない重要な違いだと思います。を設定$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"すると、によって無視され>ます。
wisbucky 2017年

3

Set-Contentをサポートしますが-Encoding Byte、サポートしOut-Fileません。

したがって、バイナリデータまたは結果をText.Encoding#GetBytes()ファイルに書き込みたい場合は、を使用する必要がありますSet-Content


0

Out-file-appendまたは ">>"は、実際には同じファイルに2つのエンコーディングを混在させることができます。ファイルが元々ASCIIまたはANSIであったとしても、デフォルトでファイルの下部にUnicodeが追加されます。Add-contentはエンコードをチェックし、追加する前にそれを照合します。ところで、export-csvのデフォルトはascii(アクセントなし)で、set-content / add-contentはansiです。

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