HOWTO · PowerShell
PowerShell と Robocopy と引数の渡し方
PowerShell から robocopy を使用してファイルとディレクトリをコピーする方法と、オプションを個別の引数として渡す方法を学びます。
このページの内容
PowerShellからファイルやディレクトリをコピーするには、Windowsのrobocopyユーティリティを、コピー元ディレクトリ、コピー先ディレクトリ、および必要なファイル選択やオプションとともに呼び出します。以下のコマンド形式では引数の並べ方を示し、PowerShellの例では複数のオプションを個別に指定する方法を説明します。
PowerShellでファイルをコピーするためのrobocopyコマンドの使用
コマンドの形式はrobocopy <Source> <Destination> [<File(s)>] [<Options>]です。コピー元とコピー先にはディレクトリを指定します。省略可能なファイル選択には、1つ以上のファイル名またはパターンを指定でき、オプションでコピーの動作を制御します。RobocopyはWindowsのコマンドラインユーティリティなので、robocopy.exeを使用できるWindows上で実行してください。
たとえば、次のコマンドはreport.txtをあるディレクトリから別のディレクトリにコピーし、Robocopyのジョブヘッダーとジョブ概要を表示しないようにします。
robocopy C:\Work\Source C:\Work\Backup report.txt /njh /njs
サンプルのパスとファイル名は、実際に存在する場所に置き換えてください。ディレクトリツリーをコピーするには、ファイル選択の引数を省略し、コピー先の後にオプションを指定します。Robocopyは指定したディレクトリ内のファイルをコピーします。必要な動作に応じて/Sや/Eなどのオプションを使うと、サブディレクトリも対象にできます。バックアップや同期にコピー結果を利用する前に、想定したファイルがコピーされたことを確認し、Robocopyのレポートを確認してください。
次のPowerShellの例では、オプションを配列の個別要素として保持し、コマンド呼び出しにスプラッティングできるリストを表示します。
$options = @('/njh', '/njs')
"Options passed: $($options -join ', ')"
Options passed: /njh, /njs
PowerShellから外部プログラムを呼び出すとき、配列をスプラッティングすると各要素が個別の引数として渡されます。たとえば、$source、$destination、$fileに使用するパスとファイル名を設定した後、& robocopy $source $destination $file @optionsを呼び出します。この呼び出しにはWindowsとRobocopyが必要なため、移植可能な配列の例には含めず、本文中に記載しています。
'/njh /njs'のように、複数のオプションを1つの文字列にまとめるのは避けてください。PowerShellはその値を1つの引数として渡します。単純なスイッチであれば、文字列を空白で分割して使える場合もありますが、汎用的な引数解析方法ではありません。空白を含む値や引用符を使う値では、空白だけでは引数のまとまりを判断できないため、分割によって正しく扱えないことがあります。各要素に完全な引数を1つずつ入れた配列を使う方法が適しています。
配列にスイッチを追加したり、ファイル選択に*.txtのようなパターンを使ったりできます。コピーされたファイルを確認し、文書化されている終了コードの意味に従ってRobocopyの結果を判断してください。8未満の値はコピーの失敗が報告されなかったことを示し、8以上の値は少なくとも1件の失敗があったことを示します。オプションや終了コードの詳細はMicrosoftのRobocopyコマンドリファレンスを参照してください。
結論
PowerShellからrobocopyを使うときは、コピー元とコピー先のディレクトリを指定し、その後に必要に応じてファイル選択とオプションを続けます。複数のオプションは配列に入れてスプラッティングし、それぞれが個別の引数としてRobocopyに渡るようにしてください。コピーされたファイルとRobocopyの報告結果を確認します。