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 はエイリアスとして copycpcpi が定義されています。

copy -> Copy-Item
cp -> Copy-Item
cpi -> Copy-Item

ファイルを別のディレクトリにコピーするには次の書式を使用します。

Copy-Item -Path ファイルのパス -Destination コピー先のディレクトリのパス

-Path および -Destination は省略可能なので、通常は次のように実行します。

Copy-Item コピー元ファイルのパス コピー先ディレクトリのパス

引数は、先にコピー元のパス、そのあとにコピー先のパスを指定します。

例えばファイルをコピーする場合、コピー元にはコピーするファイルのパスを指定し、コピー先にはコピー先のディレクトリのパスを指定します。

それではファイル c:\code\powershell\sample.txtc:\tmp ディレクトリへコピーします。次のように実行します。

Copy-Item c:\code\powershell\sample.txt c:\tmp

画面上には何も表示されません。

Copy-Itemコマンドレットの使い方(1)

コピー先に指定したディレクトリのファイルの一覧を表示してみます。

Get-ChildItem c:\tmp

Copy-Itemコマンドレットの使い方(2)

指定したファイルがコピーされていることが確認できました。

なおファイルのコピーなので、コピー元のファイルは削除されず、そのまま残ります。

Copy-Itemコマンドレットの使い方(3)

※ ファイルをコピーではなく移動したい場合は 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

上書きでコピーする場合も、特に確認などは行われずにすぐにコピーが行われます。

Copy-Itemコマンドレットの使い方(4)

コピー先のファイルを確認します。

Get-ChildItem c:\tmp

Copy-Itemコマンドレットの使い方(5)

コピー先のディレクトリにあるファイルが、コピー元のファイルと同じになっていることが確認できました。

なお -Force を付けてコピーを行うと、コピー先のディレクトリにある同じ名前のファイルが読み取り専用のファイルだったとしても、上書きでコピーが行われます。

-Force を使用すると確認なしで上書きされるため、誤って重要なファイルを上書きしないよう注意してください。

名前を変更してコピーする

ファイルをコピーすると同時に名前を変更するには、コピー先のパス(-Destination オプション)に、ディレクトリではなくファイル名まで含めたパスを指定します。

Copy-Item コピー元ファイルのパス コピー先ファイルのパス

例えば、コピー先にディレクトリだけを指定した場合は、元のファイル名のままコピーされますが、ファイル名まで指定するとその名前でコピーされます。

それではファイル c:\code\powershell\sample.txtc:\tmp\backup.txt へコピーします。次のように実行します。

Copy-Item c:\code\powershell\sample.txt c:\tmp\backup.txt

Copy-Itemコマンドレットの使い方(6)

コピーを行ったあとで、コピー先のディレクトリを確認してみると、指定した名前でファイルがコピーされていることが確認できます。

Get-ChildItem c:\tmp

Copy-Itemコマンドレットの使い方(7)

ディレクトリの内容をすべてコピーする

単一のファイルではなく、ディレクトリ内にあるファイルやサブディレクトリをコピーするには、次のように指定してください。

Copy-Item コピー元ディレクトリのパス\* コピー先ディレクトリのパス

※ サブディレクトリ自体はコピーされますが、その中にあるファイルやサブディレクトリはコピーされません。

それでは c:\code\powershell にあるファイルやディレクトリを c:\tmp へコピーします。次のように実行します。

Copy-Item c:\code\powershell\* c:\tmp

Copy-Itemコマンドレットの使い方(8)

コピー後に、コピー先のディレクトリを(サブディレクトリも含めて)確認すると、コピー元のディレクトリに含まれるファイルやサブディレクトリがコピーされているのが確認できます。またコピー元のサブディレクトリの中にあったファイルやサブディレクトリはコピーされていません。

Get-ChildItem c:\tmp -Recurse

Copy-Itemコマンドレットの使い方(9)

なお、よくある間違いとして、\* を付けずにディレクトリを指定した場合は、ディレクトリ自体がコピーされます。

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

Copy-Itemコマンドレットの使い方(10)

コピーを行ったあとで、コピー先のディレクトリを(サブディレクトリも含めて)確認してみると、コピー元のディレクトリに含まれるファイルやサブディレクトリがサブディレクトリの中も含めてコピーされていることが確認できます。

Get-ChildItem c:\tmp -Recurse

Copy-Itemコマンドレットの使い方(11)

なおディレクトリに含まれるファイルやサブディレクトリをまとめてコピーする場合も、コピー先に同じファイルがあった場合は既定では上書きされず、コピーは行われません。。コピー先に同じファイルがあっても上書きする場合には -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

Copy-Itemコマンドレットの使い方(12)

コピーを行ったあとで、コピー先のディレクトリを確認してみると、コピー元ディレクトリ内のファイルのうち、条件に一致するものだけがコピーされていることを確認できます。

Get-ChildItem c:\tmp

Copy-Itemコマンドレットの使い方(13)

-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

Copy-Itemコマンドレットの使い方(14)

コピーを行ったあとで、コピー先のディレクトリを確認してみると、コピー元ディレクトリ内のファイルのうち、条件に一致するものだけがコピーされていることを確認できます。

Get-ChildItem c:\tmp

Copy-Itemコマンドレットの使い方(15)

-Filter の場合、コピー元のサブディレクトリにあるファイルについても、条件に一致するファイルはコピーされました。ただし、コピー元のディレクトリ構造まではコピーされなかったため、コピー先のディレクトリの中にすべてコピーされています。

どちらのオプションを使用した場合でも、 -Recurse オプションを追加で使用しても、サブディレクトリの中の条件に一致するファイルはコピーされませんでした。条件に一致するファイルをサブディレクトリの中も含めてコピーするには、簡単なスクリプトを作成する必要があります。

-- --

PowerShell における Copy-Item コマンドレットの使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。