中身は同じファイルだけど、担当者別や日付別など複数ファイルを作らないといけないとき、いちいちコピー&ファイルリネームを一つずつするのは面倒ですよね。
そこで本記事では、コマンドプロンプト(CMD)を使ってファイルを一括コピーする方法を紹介します。ルーチン作業を一気に効率化できるので、業務時間の短縮や作業ミス防止にもつながります。
「毎回の手作業がしんどい…」と感じている方は、ぜひ試してみてください!
コマンドプロンプトとは?
今回使用するのはコマンドプロンプトというWindowsに標準装備されているアプリです。
以下のように真っ黒な画面ですね。

コマンドプロンプトでファイルをコピーするには
コマンドプロンプトでファイルをコピーするには、以下の記述を行います。
copy コピーするファイル コピー後のファイル
copyと記述することで、対象ファイルをコピーすることができます。
注意点としては、
・「copy」、「コピーするファイル」、「コピー後のファイル」それぞれの間にはスペースをいれる
・「コピーするファイル」、「コピー後のファイル」にはそれぞれ拡張子を記載する
(エクセルファイルであれば「xlsx」など)
などが挙げられます。
エクセルを使って記述を効率的に
ただコマンドプロンプトに記述する文を一つずつ書いていたら面倒ですよね。少しでも楽するために、エクセルを使用してみました。
今回はサンプルとして、Cドライブの直下に「テスト」というフォルダを作成し、そのフォルダに格納している「日報」エクセルファイルを数日分コピーしてみたいと思います。
「日報」というエクセルファイルを、1月1日~10日分でコピーする場合、以下のように記述しました。
順番に解説していきたいと思います。

・A列:B列~I列に記載している文字列を結合したもの
今回はconcatenate関数を使用しています。こちらで結合した文字列を、コマンドプロンプトに貼付
・B列:使用するコマンドを記載
(今回はファイルコピーのため、「copy」コマンドを記載)
・C、E列:表面上は見えませんが、スペースを入力
・D列:「コピーするファイル」を記載しています。
(今回はサンプルのため、実際のファイルパスとファイル名、拡張子を記載してください)
・F~I列:「コピー後のファイル」を記載
※concatenate関数とは?
→2つ以上のセル内の文字列を結合させることができる数式です。「&」を使用して文字列を結合しても結果は同じですが、今回は結合させる文字列が多いため、より簡単に結合できるconcatenate関数を使用しました。
※F~I列の解説について
→今回はコピー元ファイルを1日~10日分コピーするため、H列に1月○日の記載を追加しました。
→G列のアンダーバーはなくても大丈夫ですが、ファイル名を見やすくするため、今回は記載しました。
→拡張子を記載しないと正しくファイルコピーができないため、I列に拡張子を記載しています。
F列の「コピー後のファイル1」には拡張子を記載せず、リネーム後のファイル名の後に拡張子を記述することにご注意ください。
エクセルを使い、一括でコピーファイルを作成!
ここまでできたらあともう一歩!EXCELの記述内容をコマンドプロンプトにコピー&ペーストで完了です。
上記エクセルのセルA2~A11をコピーし、コマンドプロンプトにペーストすると、以下のような画面になり、ファイルがコピーされます。

こちらがコピー&ペーストした結果です。ちゃんと指定したファイルが作成されていますね。

今回は「日報」エクセルファイルをコピーしたため、日付がついているファイルは全て、「日報」エクセルファイルと同じ中身になります。
今回は日付でファイル名をコピーしましたが、日付を社員名や支店名などに変更することも可能です。
実際は使用するファイルパスとファイルに合わせ、カスタマイズしてみください!
エクセルVBAでコマンドプロンプトに貼付する方法
エクセルで作成した数式を起動したコマンドプロンプトに貼ればいいだけなのですが、それすら自動化できないかな~と思い、色々模索。エクセルで実行できるVBAコードを作ってみました!
こちらを使えば、わざわざコマンドプロンプトを開かなくてもファイルコピーできました!(コピーファイルが多い場合、一度動作検証されてから使用されてください)
Sub コマンドプロンプトに一気に貼付()
Dim shell As Object
Dim lastRow As Integer
Dim i As Integer
Dim cmd As String
Dim allCommands As String
Dim ws As Worksheet
'対象のシートを選択(「シート名」部分を変えてください)
Set ws = ThisWorkbook.Worksheets("シート名")
' Shellオブジェクトの作成
Set shell = CreateObject("WScript.Shell")
' A列の最終行を取得(コマンドプロンプトに貼付する数式がA列にあるため)
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
' コマンドを順番に一つの文字列に連結
allCommands = ""
For i = 2 To lastRow '2行目から貼付したい数式があるため、2行目~最終行で指定
cmd = ws.Cells(i, 1).Value
If cmd <> "" Then
If allCommands <> "" Then
allCommands = allCommands & " & " & cmd ' 前のコマンドと次のコマンドを繋げる
Else
allCommands = cmd ' 最初のコマンドはそのまま追加
End If
End If
Next i
' 連結したコマンドを実行
If allCommands <> "" Then
shell.Run "cmd.exe /c " & allCommands
End If
' オブジェクトの解放
Set shell = Nothing
Set ws = Nothing
End Sub
ファイル名を一部変更したい場合
ファイル作成した後、ファイル名を変えたい!というケースがあると思います。
ただファイルを複製した後だと、また作り直すのは面倒ですよね。。ましてや既にファイルが編集されている場合などは作り直すわけにもいかず。。
そんなときは、ファイル名を一括で変更する方法が役に立ちます!
今回はコマンドプロンプトで実施する場合(バッチファイル)と、PowerShellで実施する場合の2パターンを紹介します!
(個人的には、PowerShellのほうが簡単だと思います!)
今回は、「1月」ではなく「3月」であった場合で、ファイル名の「1月」を「3月」に変更する場合ということで紹介します!
コマンドプロンプトでファイル名を一括変更する場合(バッチファイル)
コマンドプロンプトでファイル名の一部を変更する場合、バッチファイルを使用して変更します。
まずはバッチファイルの作り方から紹介します!
・メモ帳を開く
(メモ帳からバッチファイルを作成していきます)

・メモ帳にコマンドを入力する
入力するコマンドは、以下内容を使用します。
※ファイルが格納されている場所に合わせ、パス名を適宜変更してください。
@echo off
setlocal EnableDelayedExpansion
cd /d "C:\Users\%USERNAME%\Desktop\テスト"
for %%f in (*1月*.xlsx) do (
set "oldname=%%f"
call set "newname=%%oldname:1月=3月%%"
echo ren "%%f" "!newname!"
ren "%%f" "!newname!"
)
pause
※少し難しいですが、バッチファイルの中身を補足します。
・setlocal EnableDelayedExpansion
→setlocal:バッチファイルで環境変数のローカライズを実施
(変数の変更が外に影響しないようにする)
→EnabledelayedExpansion:遅延展開を有効にする
(変数がリアルタイムで変更できるようにする)
今回フォルダの中にある複数ファイルを一括でリネームするコマンドを作成しました。
そのため、「newname」という変数が、ループ毎に変わる必要があります。それをリアルタイムで変更の変更を使うために、「sellocal EnableDelayedExpansion」というコマンドを使用しました。
・「名前を付けて保存」する

「名前を付けて保存」するまでは普通の流れですが、バッチファイルとして保存するとき、次の点に注意が必要です!
・ファイル名の後ろに、「.bat」とつける(バッチファイルの拡張子です)
・「ファイルの種類」を、「すべてのファイル」に変更(バッチファイルとして保存するため)
・「エンコード」を「ANSI」に設定(文字化けを防ぐため)

すると、下のようにバッチファイルが作成されました!
このバッチファイルは、ダブルクリックもしくは右クリックで実行することができます。

保存したバッチファイルを実行すると、ファイル名の「1月」が、すべて「3月」に変わりました!

PowerShellでファイル名を一括変更する場合
PowerShellでファイル名を一部変更する場合、以下の手順で進めていきます。
・変更したいファイルが入っているフォルダのアドレスバーをクリックする

・アドレスバーに「powershell」と入力し、Enterを押す

すると、以下のようなファイルが入っているフォルダを表示したPowerShell画面が表示されます。

・PowerShell画面に、以下コマンドを貼付してEnterを押す
Get-ChildItem -Filter "*1月*.xlsx" | Rename-Item -NewName { $_.Name -replace "1月", "3月" }

すると、ファイル名にあった1月が、すべて3月に書き換えられました!

いかがだったでしょうか。ルーティンでやる内容だったら、少しでも効率化していきたいですよね。
今回の内容が少しでも参考になれば幸いです。
コメント