ファイルのコピー。それはセクシーではありませんが、やらなければなりません。GUIではクリップボードを使用してコピー&ペーストしますが、PowerShellではCopy-Itemというコマンドレットがあります。
ファイルのコピーに関するコマンドは、すべてのシェル言語で古くから存在しています。PowerShellでは、PowerShellスクリプト内でファイルまたはフォルダをポイントAからポイントBにコピーするために、最も一般的な方法はPowerShellのCopy-Itemコマンドレットを使用することです。このコマンドレットを使用すると、フォルダ内のファイルを再帰的にコピーしたり、必要なファイルを選択するためにワイルドカードを使用したり、ファイルコピーにPowerShellリモートを使用したりすることができます!
このコマンドレットはPowerShellプロバイダのコマンドレットの一部です。これは一般的なコマンドレットで、その名前によって認識されます。これらのプロバイダのコマンドレットのほとんどは、異なるプロバイダ間で使用することができますが、私はPowerShellをほぼ10年間使用してきましたが、ファイルシステムプロバイダでのみCopy-Itemの使用を見たことがあります。
このコマンドレットの使用により、PowerShellを使用して開発者はさまざまな方法でファイルとフォルダをコピーすることができます。
基本的な使用方法
最も基本的な方法では、Copy-Itemコマンドレットは、Pathパラメータをソースファイルパスとして、Destinationパラメータを宛先フォルダパスとして使用して、単一のファイルをポイントAからポイントBにコピーします。
このcmdletは空のフォルダもコピーすることができます。 C:\EmptyFolder フォルダ内のアイテムをリストアップしてから、それらをコピーします。
おそらくフォルダ内に読み取り専用のファイルがあるかもしれません。デフォルトでは、Copy-Item
は上書きしません。上書きするには、Force
パラメータを追加してください。
Copy-Itemの選択的な使用
単一のファイルやフォルダだけでなく、フォルダのすべての内容をコピーすることもできます。Copy-ItemのPath
パラメータは、アスタリスクなどのワイルドカード文字を受け入れます。アスタリスクは1文字以上の一致、クエスチョンマークは1文字のみの一致に使用されます。
複数のフォルダをマージする
Copy-Itemのもう1つの便利な機能は、複数のフォルダを同時にコピーすることができることです。複数のパスをPath
パラメータに渡すと、Copy-Itemはそれぞれのパスを見て、パスに応じてフォルダまたはファイルをコピーし、すべてを1つの宛先に「マージ」します。
再帰的にファイルをコピーする
すべてのファイルが単一のフォルダに含まれ、その中にもフォルダがないという理想的な状況にはならないでしょう。通常、親フォルダに多くのサブフォルダがあり、それらの中にもコピーしたいファイルが含まれています。 Copy-Item
の Recurse
パラメータを使用すると、各サブフォルダを調べ、再帰的にすべてのファイルとフォルダをコピーします。
ここでは、ファイルとフォルダを Get-ChildItem
から直接 Copy-Item
にパイプしています。 Copy-Item
にはパイプラインのサポートがあります!
PassThruパラメータを使用する利点
PowerShellの多くのcmdletにはPassThruパラメータがあります。通常は何も返さないcmdletも、PassThruパラメータを使用することで操作対象のオブジェクトを返すことができます。このcmdletも同様です。スクリプトを作成し始めた当初は、このパラメータを使用する必要を感じなかったため、使用しませんでした。
たとえば、ファイルをリモートの場所にコピーし、後でそのファイルをスクリプト内で参照したい場合、次のようにします:
この方法は機能しますが、もっと良い方法があります。リモートパスのために変数を定義する代わりに、Copy-Item
コマンドレットをPassThru
パラメータを使用して実行した際に返されるオブジェクトをキャプチャするだけです。返されるオブジェクトには常に宛先ファイルのパスが含まれます。
PowerShellリモートセッションを使用してファイルをコピーする
PowerShell v5で導入された便利な機能の1つは、このコマンドレットがデフォルトのSMBプロトコルではなく、WinRMとPowerShellリモートセッションを使用してファイルを転送する能力です。Session
パラメータを使用することで、Copy-Item
は既存のPowerShellセッションを使用してファイルを転送します。これはファイアウォールを回避するための素晴らしい方法であり、セッションの通信が暗号化されている場合は追加のセキュリティレイヤーとなります。
ファイル.txtをSMB経由でコピーしてC$の管理共有が利用可能であることを期待することもできましたし、宛先パスに\\WEBSRV1\c$
を使用することもできました。しかし、代わりにToSession
パラメータを使用したため、宛先パスは常にリモートセッションが実行されているコンピューターのローカルパスになります。
まとめ
Copy-Item
コマンドレットは、何度も使用することになるPowerShellのコアコマンドレットの一つです。PowerShellでは、ワイルドカードを使用してファイルやフォルダをさまざまな方法でコピーすることができます。さらに、複数のフォルダ内のファイルをマージしたり、既存のPowerShellリモートセッションを使用したりすることもできます!
詳細は以下をご参照ください。
