あるフォルダーの場所から別のフォルダーにフォルダーをコピーするバッチ ファイルを作成しようとしていますが、そのコピーは 3 番目のフォルダーに存在する場合に限ります。
わかりにくいようですね。もう一度試してみます。
次の 3 つのフォルダーがあります。
- アップデート
- アプリケーション
- 以前のバージョン
\Applications
サブフォルダー構造を [新しいバージョン] のサブフォルダー構造に更新する前に、サブフォルダー構造をフォルダーに\Updates
コピーする必要があります。それが完了したら、サブフォルダー構造をフォルダーにコピーする必要があります。\Applications
\Previous Versions
Updates
/Applications
私は次のことを知りました:
Setlocal EnableDelayedExpansion
Set UpdtRoot=C:\Test\Updates
Set AppsRoot=C:\Test\Apps
Set PVerRoot=C:\Test\Previous Versions
FOR /d %%i IN ("!UpdtRoot!\*.*") DO xcopy "!AppsRoot!\%%~nxi" "!PVerRoot!\%%~nxi\" /e
ただし、これは機能しません。すべてのフォルダーが AppsRoot から PVerRoot にコピーされます。
AppsRoot
サブフォルダを からにコピーする必要がありますPVerRoot
が、 にサブフォルダが存在する場合のみですUpdtRoot
。 フォルダとサブフォルダのみをコピーする必要があるので、ファイルは一切コピーしません。
答え1
/Applications
説明どおりに、すべてのサブフォルダーをディレクトリからディレクトリに再帰的にコピーするバッチ スクリプトを追加しました/Previous Versions
。ただし、コピーする同じディレクトリが/Updates
ディレクトリ内に存在する場合のみです。
注目アイテム
SET NewCopyDir=%CopyDir:C:\Test\Apps\=%
末尾のバックスラッシュを含むディレクトリの完全パスと一致する文字C:\Test\Apps\
が に含まれていることを確認します。これは、およびディレクトリApplications
の末尾に追加するように解析するロジックであり、コマンドはそれに応じてそれらのディレクトリをコピーします。/Updates
/Previous Versions
XCOPY
Root
名前の部分はディレクトリの変数から削除されましたがSET
、それはあまり重要ではありません。ただし、スクリプト ロジックで少しきれいに見えるように、それらを短縮しました。
バッチスクリプト
@ECHO ON
SET "Updt=C:\Test\Updates"
SET "Apps=C:\Test\Apps"
SET "PVer=C:\Test\previous Versions"
IF NOT EXIST "%Updt%" MD "%Updt%"
IF NOT EXIST "%Apps%" MD "%Apps%"
IF NOT EXIST "%PVer%" MD "%PVer%"
FOR /D %%S IN ("%Apps%\*") DO (
CALL :Routine "%%~S"
)
GOTO :EOF
:Routine
SET CopyDir=%~1
SET NewCopyDir=%CopyDir:C:\Test\Apps\=%
IF EXIST "%Updt%\%NewCopyDir%" XCOPY /E /T "%Apps%\%NewCopyDir%" "%PVer%\%NewCopyDir%\"
GOTO :EOF