既存のデータを再編成しており、既存のすべてのファイルとディレクトリを格納するための新しいサブディレクトリを作成する必要があります。その目的は、新しい製品ラインのためのスペースを確保すると同時に、既存のデータの命名規則を改善することです。
たとえば、現在次のようなデータがあります。
\root directory\
+-proj1357
+-closing binder
+-refi
+-compliance
+-proj2468
+-disbursements
+-compliance
+-proj3579
+-pre-close
+-compliance
実際は次のようになります:
\root directory\
+-proj1357
+-dpl
+-closing binder
+-refi
+-compliance
+-proj2468
+-dpl
+-disbursements
+-compliance
+-proj3579
+-dpl
+-pre-close
+-compliance
私が抱えている問題は、再帰ループに陥ることなく正しいコマンドを取得できないことです。これをハッキングしているときに、「循環コピーを実行できません」というエラーが頻繁に発生しました。
幸いなことに、実用的なソリューションが見つかりました。ただし、3 つの個別のコマンドと、プロジェクト ディレクトリごとにカスタム構文が必要になります。
command 1> ROBOCOPY G:\proj1357 DPL /E /MOVE
command 2> MOVE G:\proj1357\DPL\DPL\*.* G:\proj1357\DPL
command 3> RMDIR G:\proj1357\DPL\DPL\
私の知る限り、コマンド 1 はすべてのファイルとディレクトリを新しいサブディレクトリに移動します。また、プロジェクト レベルのディレクトリ内のファイルをより深いサブディレクトリに移動することで、再帰的な問題が発生します。そのため、コマンド 2 を使用して、プロジェクト レベルのディレクトリにあったファイルを回復します。次に、コマンド 3 でより深いサブディレクトリを削除します。
Windows ベースのシステムでコマンドまたはバッチ ファイルを実行するより良い方法はありますか? 理想的には、すべてのプロジェクト レベルのディレクトリをクロールし、その内容を新しいサブディレクトリに移動します。1,000 を超えるプロジェクトを処理する予定なので、正しくループする方法を理解するのに時間をかける価値があると思います。
私が直面している問題のより視覚的な背景については、以下のスクリーンショットを参照してください。
更新しました
上で概説した 3 ステップのコマンド ライン メソッドを使用して動作させようとした後、諦めて、jiggunjer の回答を自分の環境に合わせて変更しました。以下は、私が使用した MS バッチ ファイルです。各行の目的を明確にするために、コメントも追加しました。
@echo off
rem run this batch file in top level directory
rem top level directory should contain all project number directories
rem assumes that all directories starting with a digit are project number directories
rem initialize the listing of all directories
set rootlist=dir /b /a:D
rem initialize numerical filtering
set filter=findstr "^[1-9]"
rem loop through all directories that comply with filtering (start with a digit)
rem use command extension /F to process (in this case) command output
rem identifies all project number parent-directories
rem assign parent-directories to variable %%P, as in 'Project'
FOR /F %%P in ('%rootlist% ^| %filter%') DO (
rem pass the variable %%P to the moveproject loop
call :moveproject "%%P"
rem move files that were ignored by the robocopy command
rem these are 'loose' files that were in the project number directory, but not saved in any subdirectory
rem assumes the robocopy command successfully creates the DPL directory
MOVE %%P\*.* %%P\DPL\
)
rem pause to review command log
pause
:moveproject
rem ensure that the parameter has value
rem converts variable %%P to parameter no. 1
if not [%1] == [] (
rem loop through all sub-directories under each project number
rem use command extension /D to process directories only
rem removing any surrounding quotes (") from parameter no. 1 by using optional syntax -- percent-tilde
rem assign sub-directories to variable %%O, as in 'Origin'
FOR /D %%O IN ("%~1\*") DO (
rem display values
echo project number %%P
echo directory origin %%O
rem delimit origin directory using backslash character
rem use command extension /F to process (in this case) strings
rem assign the second delimited piece to variable %%D, as in 'Destination'
rem effectively drops all text to the left of the first backslash character
FOR /F "tokens=2 delims=\" %%D IN ("%%O") DO (
rem display values
echo %%D
echo directory destination %%P\DPL\%%D
rem move all directories to DPL sub-directory
rem simultaniously creates the receiving DPL directory
robocopy /E /MOVE "%%O" "%%P\DPL\%%D"
)
)
)
答え1
これら 8 つのルート ディレクトリのそれぞれで、次のコマンドを実行します。
FOR /D %p IN ("*") DO robocopy /E /MOVE "%p" "%p/DPL"
Powershell 3.0以降のバージョン:
gci -dir -name | foreach-object{robocopy /E /MOVE $_ ($_ + '\DPL')}
または
スクリーンショットに基づくと、オールインワン ソリューションは次のようになります。
@echo off
REM Assume: Running in top level dir.
REM Assume: Only project parent fodlers start with a digit.
set rootlist=dir /b /a:D
set filter=findstr "^[1-9]"
FOR /f %%d in ('%rootlist% ^| %filter%') DO (
call :moveproject "%%d"
)
:moveproject
if not [%1] == [] (
FOR /D %%p IN ("%~1\*") DO robocopy /E /MOVE "%%p" "%%p/DPL"
)
再子育ておめでとうございます!
答え2
あなたはこれを行うことができます:
@echo off
mkdir %2
cd %1
SETLOCAL EnableDelayedExpansion
for /f "delims=" %%D in ('dir /a:d /b') do (
set project_path=%%~fD
move "!project_path!" "%~2%\temp"
mkdir "!project_path!"
move "%~2%\temp" "!project_path!\dpl"
)
2 つのパラメータを取ります。1 つ目はプロジェクトを含むパス、2 つ目は一時パスです。
これは、プロジェクトを一時パスに移動し、古いプロジェクト名 / dpl に戻すだけです。
注: 最初のパスにはプロジェクト ディレクトリのみが含まれていると想定され、このレベルのディレクトリ以外のものは無視されます。