Add-Contentコマンドレットの-Valueパラメータ

 

-value <Object[]> パラメータ

指定したファイルに追記する値を指定します。
追記できる値は、文字列、コマンドレットが返す値などを指定します。

–––––––––– -value パラメータの使用例1 ––––––––––

Add-Content -Path "Test.txt" -Value "テストファイルです"

このコマンドレットを実行すると、既存のTest.txtファイルに「テストファイルです」という文字列を追記します。

 

–––––––––– -value パラメータの使用例2 ––––––––––

$a = "テストファイルです"
Add-Content -Path "Test.txt" -Value $a

このコマンドレットを実行すると変数 $a に代入した文字列を Test.txt へ追記します。

 

–––––––––– -value パラメータの使用例3 ––––––––––

Add-Content -Path "Date.txt" -Value (Get-Date)

このコマンドレットを実行すると Get-Dateコマンドレットが返す値を Date.txt に追記します。
このようにコマンドレットが返す値を追記することが可能ですが、複数の値を一度に返すようなコマンドレットを指定した場合には期待通りの値を取得できないので注意が必要です。

 

–––––––––– -value パラメータの使用例4 ––––––––––

Add-Content -Path "Test.txt" -Value (Get-Content "Sample.txt")

このコマンドレットを実行すると、Sample.txt の内容を Test.txt に追記します。
-value パラメータに直接パスを指定しても、パスを文字列として認識してしまうためこのような処理が必要となります。

 

–––––––––– -value パラメータのNG例1 ––––––––––

Add-Content -Path "ServiceList.txt" -Value (Get-Service)

このコマンドレットは Get-Service のコマンドレットの結果を ServiceList.txtに追記しようとしていますが期待通りの結果にはなりません。("System.ServiceProcess.ServiceController"という文字列がサービスの数だけ書き込まれます)
これは、Get-Service が複数のオブジェクトを返すためです。

Get-Service | %{Add-Content -Path "ServiceList.txt" -Value $_.ServiceName}

などの工夫が必要です。

Add-Contentコマンドレットの-Pathパラメータ

現在、PowerShell
Wiki
でAdd-Contentコマンドレットの使用方法についてまとめています。(サイト自体は今年の7月に立ち上げていたのですがこれから始動といったところです)

では、本題です。


Add-Contentコマンドレットは

指定した項目やファイルに内容を追加することができます。内容を指定するには、コマンドに内容を入力するか、内容が入力されているオブジェクトを指定します。指定した項目やファイルが存在しない場合は、新規で作成され、指定した値が追記されます。


基本構文

Add-Content -Path "パス文字列" -Value "追記する値"

です。実際には数多くのパラメータがありますが、後日紹介していきたいと思います。

今回取り上げるのは-Pathパラメータです。


-Pathパラメータは

内容を追加する先のパスを指定します。パスにはワイルドカードを指定することができます。また、カンマで区切ることで複数のファイルを指定することができます。

エスケープ文字を含むパスを指定することはできません。エスケープ文字を含むパスを指定したい場合は-literalPathパラメータを使用します。(PowerShellでは`(アクサングラーブ文字)がエスケープ文字として扱われます。)


使用例

–––––––––– -Pathパラメータの使用例1 ––––––––––

Add-Content -Path "test.txt" -Value "ABC"

このコマンドを実行すると、カレントディレクトリに存在する
test.txt
というファイルに"ABC"という文字列を追記します。
ファイルが存在しない場合は新規で作成され"ABC"という文字列を書き込みます。

––––––––––
-Pathパラメータの使用例2 ––––––––––

Add-Content -Path "test1.txt","test2.txt" -Value "ABC"

このコマンドを実行すると、test1.txt

test2.txtの2つのファイルに文字列"ABC"を追記します。
ファイルが存在しない場合は新規で作成され"ABC"という文字列を書き込みます。

––––––––––
-Pathパラメータの使用例3 ––––––––––

Add-Content -Path "*.txt" -Value "ABC"


このコマンドを実行すると、カレントディレクトリにある拡張子が*.txtのファイルに"ABC"という文字列を追記します。


–––––––––– -PathパラメータのNG例1 ––––––––––

Add-Content -Path "tes`t.txt" -Value "ABC"

このコマンドレットはパスにエスケープ文字`tが含まれているため「パスに無効な文字が含まれています。」のエラーが発生します。
エスケープ文字が含まれているパスを指定したい場合には-Pathパラメータの代わりに-literalPathパラメータを使用します。

––––––––––
-PathパラメータのNG例2 ––––––––––

Add-Content -Path "tes[t.txt" -Value "ABC"

このコマンドレットはパスに[が含まれているため「指定されたワイルドカード
パターンは無効です」のエラーが発生します。-Pathパラメータでは"["をワイルドカードととして認識します。この例で使用されている文字"["は正規表現で使用される文字であり"]"と対で使用しなければなりません。このようなファイル名を使用したい場合は-Pathパラメータの代わりに-literalPathパラメータを使用します。


まとめ

-Pathパラメータはワイルドカードを使用して、複数ファイルへ一気に同じ文字列を追記できるところがすごいですね。

ワイルドカードを使用できる分、-PathパラメータのNG例2のようにワイルドカード構成する文字を含むパスは指定できないという制限がありますが、-literalPathパラメータを使用すればこの問題は回避できます。

-Pathと-literalPathパラメータを使い分けるポイントとなりますね。

Measure-Object

これは以前にdevslife.comに書いた記事です。

Get-CommandでCmdletを眺めていたらMeasure-ObjectというCmdletに出くわした。なかなか面白いCmdletで使えそうである。例えば・・・

 

上のコマンドを解説すると、10,11,12…100までの配列がMeasure-Objectによって処理されてデフォルトでCountつまり配列がいくつあるかというのを表示してくれた。他にもAverage(平均)やSum(合計)やMaximum(最大値)そしてMinimum(最小値)も計算させることができそうだ。パラメータを追加すると他の値も計算してくれる。

 

日本語のテキスト(文字列)についても使える。下の例は-charのパラメータを使うことで変数内にある文字数を数えてくれるのだ。

 

テキストファイルに入っている文字列に関しても同じように使える。

 

さらに、他のオブジェクトに関しても-Propertyパラメータを使えばこんなことができる。

 

上のコマンドはどういうことかというと、Get-Processのコマンドレットで返されたプロセスのVMつまりバーチャルメモリに関しての統計である。つまりこのマシン上には50のプロセスが存在していて平均、合計、最大、最小がそれぞれの値であるということを表している。

Measure-Objectはちょっと統計を見てみたいというときに使えるコマンドレットだ。