PowerShell Set-Contentを使ったファイルへの書き込み:完全ガイド

Set-Contentは、私が欠かせないPowerShellのコアコマンドレットの一つです。PowerShellを使用してファイルに書き込む前にVBScriptを使用していたことを覚えています。どのようなオブジェクトを使用する必要があるのか、メソッド名は何だったか、いつも覚えようとしていました。それは苦痛でした!たとえメソッド名がCreateTextFile()であることを思い出しても、2番目の引数としてTrueを追加するのをいつも忘れてしまいます。

以下は、そのような醜態の例です。

Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile="c:\file.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write "test string"
objFile.Close

このVBScriptとPowerShellを比較してみましょう:

Set-Content -Path 'C:\file.txt' -Value 'test string'

どちらが好みですか?私はPowerShellの方法を選びます!PowerShellの方法は、Set-Contentという単一のコマンドレットを使用します。このコマンドレットを使用すると、PowerShellをより簡単にファイルに書き込むことができます。このPowerShellコマンドレットは、1つの目的を持つ組み込みコマンドレットです。それはファイルに書き込むことです。

挙動を若干変更するためのいくつかのパラメータがあるかもしれませんが、ファイルに書き込むことに特化しています。ただし、似ているためAdd-Contentと混同しないでください。Set-Contentはファイル全体を上書きしますが、Add-Contentはファイルに追記します。最初に始めたときに何度も苦労しました!

ファイルの作成/上書き

Set-Contentコマンドレットは非常にシンプルです。以下は良い例です。この例では、Set-Contentが存在しない場合にファイルを作成することも、既存のファイルの内容をすべて置き換えることもできることを示しています。

PS> Test-Path -Path C:\test.txt
False
PS> Set-Content -Path C:\test.txt -Value 'foo'
PS> Get-Content -Path C:\test.txt
foo
PS> Set-Content -Path C:\test.txt -Value 'bar'
PS> Get-Content -Path C:\test.txt
bar

ファイルへの出力

1つのファイルに出力することができるコマンドレットは Out-File ですが、Set-Content は同じタスクを少し異なる方法で実行することができます。

もしかしたら、1つのテキストファイルから特定のテキストを抽出し、別のファイルに行を出力したいかもしれません。Get-Content を使用してファイルを読み取り、Set-Content を使用してファイルに書き込むことで、これを実現することができます。たとえば、1つのサーバーとそのステータスが各行に記載されたテキストファイルがあるとします。各サーバーのステータスを読み取り、それをファイルに出力したいとします。ファイルを読み取るために Get-Content を使用し、ファイルに書き込むために Set-Content を使用することで、これが可能です。

PS> Get-Content -Path C:\test.txt
SRV1 Status: Up
SRV2 Status: Down
SRV3 Status: Up
PS> Get-Content -Path C:\test.txt | ForEach-Object {
>>> $srvName = $_.Split(' ')[0]
>>> Set-Content -Path "C:\$srvName.txt" -Value $_
}
PS> Get-ChildItem -Filter 'SRV*'
Directory: C:\
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       10/29/2017  12:38 PM             17 SRV1.txt
-a----       10/29/2017  12:38 PM             19 SRv2.txt
-a----       10/29/2017  12:38 PM             17 SRV3.txt

PS> Get-ChildItem -Filter 'SRV*' | Get-Content
SRV1 Status: Up
SRV2 Status: Down
SRV3 Status: Up

Set-Content は常に使用される基本的なコマンドレットの1つです。派手ではありませんが、いつでも動作し、PowerShell の便利なツールとして持っているべきものです。

詳細については、Set-Content の Microsoft ドキュメントを参照してください。

Source:
https://adamtheautomator.com/powershell-write-to-file/