Ich organisiere vorhandene Daten neu und muss ein neues Unterverzeichnis erstellen, in dem alle vorhandenen Dateien und Verzeichnisse untergebracht werden. Damit soll Platz für eine neue Produktlinie geschaffen und gleichzeitig die Namenskonvention vorhandener Daten verbessert werden.
Beispielsweise sehen Daten derzeit ungefähr so aus:
\root directory\
+-proj1357
+-closing binder
+-refi
+-compliance
+-proj2468
+-disbursements
+-compliance
+-proj3579
+-pre-close
+-compliance
Sollte eigentlich so aussehen:
\root directory\
+-proj1357
+-dpl
+-closing binder
+-refi
+-compliance
+-proj2468
+-dpl
+-disbursements
+-compliance
+-proj3579
+-dpl
+-pre-close
+-compliance
Mein Problem ist, dass ich scheinbar nicht den richtigen Befehl bekomme, ohne in einer rekursiven Schleife steckenzubleiben. Während ich das zusammengehackt habe, ist mir häufig der Fehler „zyklische Kopie kann nicht durchgeführt werden“ begegnet.
Die gute Nachricht ist, dass ich eine funktionierende Lösung habe, die jedoch drei separate Befehle und eine benutzerdefinierte Syntax für jedes Projektverzeichnis erfordert.
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\
Soweit ich das beurteilen kann, verschiebt Befehl 1 alle Dateien und Verzeichnisse in das neue Unterverzeichnis. Es verursacht auch ein rekursives Problem, indem es Dateien im Projektverzeichnis in ein tieferes Unterverzeichnis verschiebt. Daher verlasse ich mich auf Befehl 2, um Dateien wiederherzustellen, die sich einst im Projektverzeichnis befanden. Dann entfernt Befehl 3 das tiefere Unterverzeichnis.
Gibt es eine bessere Möglichkeit, einen Befehl oder eine Batchdatei über ein Windows-basiertes System auszuführen? Im Idealfall würde es alle Verzeichnisse auf Projektebene durchsuchen und den Inhalt in das neue Unterverzeichnis verschieben. Ich habe vor, über tausend Projekte zu verarbeiten, daher denke ich, dass es sich lohnt, herauszufinden, wie man es richtig durchläuft.
Einen visuelleren Kontext zu meinem Problem finden Sie im Screenshot unten.
AKTUALISIERT
Nachdem ich versucht hatte, es mit der oben beschriebenen dreistufigen Befehlszeilenmethode zum Laufen zu bringen, gab ich nach und passte die Antwort von jiggunjer an meine Umgebung an. Unten ist die MS-Batchdatei, die ich verwendet habe. Ich habe auch Anmerkungen hinzugefügt, um den Zweck jeder Zeile zu verdeutlichen.
@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"
)
)
)
Antwort1
Führen Sie in jedem dieser 8 Stammverzeichnisse diesen Befehl aus:
FOR /D %p IN ("*") DO robocopy /E /MOVE "%p" "%p/DPL"
Powershell 3.0+ Version:
gci -dir -name | foreach-object{robocopy /E /MOVE $_ ($_ + '\DPL')}
ODER
Basierend auf Ihrem Screenshot würde eine Komplettlösung etwa so aussehen:
@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"
)
Viel Spaß beim Neu-Erziehen!
Antwort2
Du kannst das:
@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"
)
Nimmt 2 Parameter an. Der erste ist der Pfad, der Ihre Projekte enthält, der zweite ist der temporäre Pfad.
Dabei wird das Projekt einfach in einen temporären Pfad verschoben und anschließend zurück zum alten Projektnamen/dpl verschoben.
Hinweis: Es wird davon ausgegangen, dass der erste Pfad nur Projektverzeichnisse enthält. Nicht-Verzeichnisse auf dieser Ebene werden ignoriert.