PowerShellでテキストファイルを処理する

例えば、フォルダの一覧のテキストファイル「folders.txt」があるとして、多くのプログラミング言語(ここでは「Ruby」)ではフォルダをコピーするスクリプトを作ろうとすると、ループする処理を書いて、ブロック内に個別の処理を書くのが素直でしょう。複数の処理がある場合は、処理がネストしていきます(この場合は処理が1行なので、ifを後置するif修飾子で対応できますが…)。ドットで始まるフォルダは除外しましょう。

File.foreach("folders.txt") do |line|
  if line[0,1] != '.'
    puts "robocopy \\\\file-server\\#{line.chomp} D:\\#{line.chomp} /MIR"
  end
end

PowerShellの場合は、集合を取得する処理を書いて、各要素に対する処理を書きます。処理をパイプで数珠繋ぎにしていきます。

Get-Content folders.txt|
?{$_.Substring(0,1) -ne '.'}|
%{"robocopy \\file-server\{0} D:\{0} /MIR" -f $_}|
Set-Content mirror.cmd.txt

また、結果をファイルに書き出す際、Ruby 等のスクリプト言語の場合は出力先を標準出力にしておいて実行時にリダイレクトするのが、PowerShellの場合は書き出す処理をスクリプトに含めるのが一般的な気がします(注.個人の感想です)。

なんでこんな記事を書くかというと、PowerShellでテキストフィルタを書こうとすると一瞬書き出しに迷うことがある自分への備忘録です。