Copy-Itemの使い方:ファイルやディレクトリを別の場所にコピーする
Copy-Item コマンドレットは、指定したファイルやディレクトリを、別の場所にコピーすることができます。コピーなので、元のファイルやディレクトリは削除されません。バックアップの作成や、ファイルを別の場所に複製したい場合によく使用されます。ここでは PowerShell における Copy-Item コマンドレットの使い方について解説します。
Copy-Itemコマンドレットの書式
Copy-Item コマンドレットは、指定したファイルやディレクトリを、別の場所にコピーできます。 Copy-Item コマンドレットの書式は次の通りです。
Copy-Item [-Path] <String[]> [[-Destination] <String>] [-Container] [-Force] [-Filter <String>] [-Include <String[]>] [-Exclude <String[]>] [-Recurse] [-PassThru] [-Credential <PSCredential>] [-WhatIf] [-Confirm] [-FromSession <PSSession>] [-ToSession <PSSession>] [<CommonParameters>]
Copy-Item はエイリアスとして copy、 cp、 cpi が定義されています。
copy -> Copy-Item cp -> Copy-Item cpi -> Copy-Item
ファイルを別のディレクトリにコピーするには次の書式を使用します。
Copy-Item -Path ファイルのパス -Destination コピー先のディレクトリのパス
-Path および -Destination は省略可能なので、通常は次のように実行します。
Copy-Item コピー元ファイルのパス コピー先ディレクトリのパス
引数は、先にコピー元のパス、そのあとにコピー先のパスを指定します。
例えばファイルをコピーする場合、コピー元にはコピーするファイルのパスを指定し、コピー先にはコピー先のディレクトリのパスを指定します。
それではファイル c:\code\powershell\sample.txt を c:\tmp ディレクトリへコピーします。次のように実行します。
Copy-Item c:\code\powershell\sample.txt c:\tmp
画面上には何も表示されません。
コピー先に指定したディレクトリのファイルの一覧を表示してみます。
Get-ChildItem c:\tmp
指定したファイルがコピーされていることが確認できました。
なおファイルのコピーなので、コピー元のファイルは削除されず、そのまま残ります。
※ ファイルをコピーではなく移動したい場合は Move-Item コマンドレットを使用します。(詳しい使い方は「Move-Itemの使い方:ファイルやディレクトリを別の場所に移動する」を参照してください)。
上書きしてコピーする
Copy-Item を使ってファイルをコピーするときに、コピー先のディレクトリに同じ名前のファイルが既に存在した場合、既定では上書きされず、コピーは行われません。 PowerShell の場合は、更新日時などは関係なく、同じ名前のファイルが既にあった場合はコピーを行いません。
例えば次の sample.txt をコピーする場合で考えてみます。
PS C:\code\powershell> Get-ChildItem c:\code\powershell\sample.txt
Directory: C:\code\powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2024/05/31 17:52 122 sample.txt
コピー先のディレクトリには既に同じ名前の sample.txt があります。
PS C:\code\powershell> Get-ChildItem c:\tmp
Directory: C:\tmp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2026/03/04 11:32 302 sample.txt
Copy-Item を使ってファイルをコピーします。
Copy-Item c:\code\powershell\sample.txt c:\tmp
コマンドを実行すると、特に失敗したかどうかの表示されません。コピー先のディレクトリにあるファイルを確認してみると、コピー前と変わっておらずコピーが失敗したことが確認できます。
PS C:\code\powershell> Copy-Item c:\code\powershell\sample.txt c:\tmp
PS C:\code\powershell>
PS C:\code\powershell> Get-ChildItem c:\tmp
Directory: C:\tmp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2026/03/04 11:32 302 sample.txt
このようにコピー先に同じ名前のファイルが既にある場合はコピーは失敗します。
-Forceオプション
-Force オプションを設定すると、コピー先に同じ名前のファイルがあっても、上書きしてコピーを行います。
Copy-Item コピー元ファイルのパス コピー先ディレクトリのパス -Force
では実際に試してみます。先ほどと同じ状態で、今度は -Force を付けてコピーを行います。
Copy-Item c:\code\powershell\sample.txt c:\tmp -Force
上書きでコピーする場合も、特に確認などは行われずにすぐにコピーが行われます。
コピー先のファイルを確認します。
Get-ChildItem c:\tmp
コピー先のディレクトリにあるファイルが、コピー元のファイルと同じになっていることが確認できました。
なお -Force を付けてコピーを行うと、コピー先のディレクトリにある同じ名前のファイルが読み取り専用のファイルだったとしても、上書きでコピーが行われます。
※ -Force を使用すると確認なしで上書きされるため、誤って重要なファイルを上書きしないよう注意してください。
名前を変更してコピーする
ファイルをコピーすると同時に名前を変更するには、コピー先のパス(-Destination オプション)に、ディレクトリではなくファイル名まで含めたパスを指定します。
Copy-Item コピー元ファイルのパス コピー先ファイルのパス
例えば、コピー先にディレクトリだけを指定した場合は、元のファイル名のままコピーされますが、ファイル名まで指定するとその名前でコピーされます。
それではファイル c:\code\powershell\sample.txt を c:\tmp\backup.txt へコピーします。次のように実行します。
Copy-Item c:\code\powershell\sample.txt c:\tmp\backup.txt
コピーを行ったあとで、コピー先のディレクトリを確認してみると、指定した名前でファイルがコピーされていることが確認できます。
Get-ChildItem c:\tmp
ディレクトリの内容をすべてコピーする
単一のファイルではなく、ディレクトリ内にあるファイルやサブディレクトリをコピーするには、次のように指定してください。
Copy-Item コピー元ディレクトリのパス\* コピー先ディレクトリのパス
※ サブディレクトリ自体はコピーされますが、その中にあるファイルやサブディレクトリはコピーされません。
それでは c:\code\powershell にあるファイルやディレクトリを c:\tmp へコピーします。次のように実行します。
Copy-Item c:\code\powershell\* c:\tmp
コピー後に、コピー先のディレクトリを(サブディレクトリも含めて)確認すると、コピー元のディレクトリに含まれるファイルやサブディレクトリがコピーされているのが確認できます。またコピー元のサブディレクトリの中にあったファイルやサブディレクトリはコピーされていません。
Get-ChildItem c:\tmp -Recurse
なお、よくある間違いとして、\* を付けずにディレクトリを指定した場合は、ディレクトリ自体がコピーされます。
Copy-Item c:\code\powershell c:\tmp
この場合は powershell ディレクトリ自体がコピーされるため、コピー先に c:\tmp\powershell というディレクトリが作成されます。
ただし、-Recurse オプションを指定していないため、ディレクトリの中にあるファイルやサブディレクトリはコピーされません。
このように、\* を付けた場合はディレクトリの「中身」をコピーし、付けない場合はディレクトリ「そのもの」をコピーします。
サブディレクトリの中にあるファイルも含めてコピーする
ディレクトリに含まれるファイルやサブディレクトリをコピーするときに、サブディレクトリの中にファイルやサブディレクトリがあった場合は、それも含めてコピーする場合は -Recurse オプションを使用します。
Copy-Item コピー元ディレクトリのパス\* コピー先ディレクトリのパス -Recurse
それではファイル c:\code\powershell にあるファイルやディレクトリをサブディレクトリの中も含めて c:\tmp へコピーします。次のように実行します。
Copy-Item c:\code\powershell\* c:\tmp -Recurse
コピーを行ったあとで、コピー先のディレクトリを(サブディレクトリも含めて)確認してみると、コピー元のディレクトリに含まれるファイルやサブディレクトリがサブディレクトリの中も含めてコピーされていることが確認できます。
Get-ChildItem c:\tmp -Recurse
なおディレクトリに含まれるファイルやサブディレクトリをまとめてコピーする場合も、コピー先に同じファイルがあった場合は既定では上書きされず、コピーは行われません。。コピー先に同じファイルがあっても上書きする場合には -Force オプションを指定してください。
条件に一致するファイルやディレクトリをコピーする
Copy-Item では特定の条件を満たすファイルやディレクトリだけをコピーすることができます。
-Includeオプション
-Include オプションを使用すると、条件に一致するファイルやディレクトリだけをコピーすることができます。
Copy-Item コピー元ディレクトリのパス\* コピー先ディレクトリのパス -Include パターン
パターンには任意の長さの文字とマッチする * と任意の 1 文字とマッチする ? を使用できます。例えば拡張子が .txt のファイルだけをコピーしたい場合は、パターンに *.txt と指定してください。
Copy-Item コピー元ディレクトリのパス\* コピー先ディレクトリのパス -Include *.txt
パターンは複数指定することもできます。複数指定する場合は、カンマ(,)で区切って続けて記述します。複数指定した場合はいずれかのパターンと一致するファイルやディレクトリをコピーします。
Copy-Item コピー元ディレクトリのパス\* コピー先ディレクトリのパス -Include *.png,*.jpg
それでは実際に試してみます。次のように実行します。指定したディレクトリの中にある、拡張子が *.ps1 のファイルをコピーしました。
Copy-Item c:\code\powershell\* c:\tmp -Include *.ps1
コピーを行ったあとで、コピー先のディレクトリを確認してみると、コピー元ディレクトリ内のファイルのうち、条件に一致するものだけがコピーされていることを確認できます。
Get-ChildItem c:\tmp
-Filterオプション
-Filter オプションを使用すると、条件に一致するファイルやディレクトリだけをコピーすることができます。
Copy-Item コピー元ディレクトリのパス\* コピー先ディレクトリのパス -Filter パターン
パターンには任意の長さの文字とマッチする * と任意の 1 文字とマッチする ? を使用できます。例えば拡張子が .txt のファイルだけをコピーしたい場合は、パターンに *.txt と指定してください。
Copy-Item コピー元ディレクトリのパス\* コピー先ディレクトリのパス -Filter *.txt
-Include と似ていますが、 -Filter はファイルシステム側で絞り込みを行うため、より高速に処理されます。
ただし -Include と異なり、 -Filter ではパターンを複数指定することができません。
それでは実際に試してみます。次のように実行します。指定したディレクトリの中にある、拡張子が *.ps1 のファイルをコピーしました。
Copy-Item c:\code\powershell\* c:\tmp -Filter *.ps1
コピーを行ったあとで、コピー先のディレクトリを確認してみると、コピー元ディレクトリ内のファイルのうち、条件に一致するものだけがコピーされていることを確認できます。
Get-ChildItem c:\tmp
-Filter の場合、コピー元のサブディレクトリにあるファイルについても、条件に一致するファイルはコピーされました。ただし、コピー元のディレクトリ構造まではコピーされなかったため、コピー先のディレクトリの中にすべてコピーされています。
どちらのオプションを使用した場合でも、 -Recurse オプションを追加で使用しても、サブディレクトリの中の条件に一致するファイルはコピーされませんでした。条件に一致するファイルをサブディレクトリの中も含めてコピーするには、簡単なスクリプトを作成する必要があります。
-- --
PowerShell における Copy-Item コマンドレットの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。