PowerShellでは、違いは何だOut-File
とはSet-Content
?それともAdd-Content
とOut-File -append
?
同じファイルに対して両方を使用すると、テキストが完全に文字化けされていることがわかりました。
(マイナーな2番目の質問:>
のエイリアスOut-File
ですか?)
PowerShellでは、違いは何だOut-File
とはSet-Content
?それともAdd-Content
とOut-File -append
?
同じファイルに対して両方を使用すると、テキストが完全に文字化けされていることがわかりました。
(マイナーな2番目の質問:>
のエイリアスOut-File
ですか?)
回答:
これは、PowerShellの数か月の経験といくつかの科学的実験の後で、私が推測したことの要約です。私はドキュメントでこれを見つけたことがありません:(
[更新:これの多くは、より適切に文書化されているように見えます。]
のOut-File
実行中に、別のアプリケーションがログファイルを読み取ることができます。
のSet-Content
実行中、他のアプリケーションはログファイルを読み取ることができません。したがって、長時間実行されるコマンドのログに使用Set-Content
しないでください。
Out-File
デフォルトではUnicode
(UTF-16LE
)エンコーディングで保存されますが(これは指定できます)、PowerShell 3+ではSet-Content
デフォルトでASCII
(US-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
次の追加パラメータが含まれます。
Out-File
次の追加パラメータが含まれます。
これらのパラメータの詳細については、ヘルプを参照してください。例:get-help out-file -parameter append
。
Out-File
、特定の状況では長い行に問題があることに注意してください。例: $x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
。
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は作成されます。
Add-Content
、何も受け取りません。Add-Content
何も受け取らない場合、なぜファイルを作成する必要があるのですか?一方、Out-Fileについても同じ質問をすることができます。
gci $folder | Out-File log.txt ; cat log.txt
が、gci $folder | Add-Content log.txt ; cat log.txt
爆破します
Set-Content
使用中はファイルを他のアプリケーションで使用できないことです。
まあ、私は同意しません... :)
そう:
ls | Add-Content test.txt
そして
ls | Out-File test.txt
まったく異なる結果が得られます。
いいえ、「>」はエイリアスではなく、リダイレクト演算子です(他のシェルと同じです)。そして、非常に深刻な制限があります...それはそれらが表示されるのと同じ方法で線をカットします。Out-Fileには、これを回避するのに役立つ-Widthパラメーターがあります。また、リダイレクト演算子を使用すると、使用するエンコーディングを決定できません。
HTH Bartek
>
と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.
>
はout-file
。と完全に同等ではない重要な違いだと思います。を設定$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
すると、によって無視され>
ます。
Set-Content
デフォルトのエンコーディング:に変換されます(Get-Culture).Textinfo.ANSICodePage
(Windows 8.1、cs-CZ
Powershell 4.0、CurrentCulture 、CurrentUICultureen-GB
、ANSICodePage1250
、OEMCodePage852
、'řž'
上記のコードページで異なるコードの文字列を使用してテスト済み)。