2016-05-16 4 views
-4

Ich bin neu im Batch-Scripting, ich brauche Hilfe, um diese sich wiederholende manuelle Aufgabe zu lösen. Ich braucheBatch-Datei zum Umbenennen eines Unterordners entsprechend dem Namen des Unterordners

mit der Batch-Datei zu automatisieren Ich habe diese Verzeichnisse Strukturen wie unten Beispiel

c:\machines\models\a\defects 
c:\machines\models\b\defects 
c:\machines\models\c\defects 
c:\machines\models\d\defects 
and it continues e, f, g, h 

(a, b, c, d ist nur beispielsweise Maschinen die Ordner nach Modellen generieren wir testen)

ich möchte die Defekte Ordnerinhalte bewegen (inklusive Unterordner & Dateien im Inneren) zu einem Zielordner, die haben: 1. Aktuelles Datum 2. Umbenennungs Defekte nach Modellen, um es den Ordner wie in unten gewünschte Ausgabe gezeigt mit Batc h Datei (ms dos)

e:\backup\currentdate\a_defects 
e:\backup\currentdate\b_defects 
e:\backup\currentdate\c_defects 
e:\backup\currentdate\d_defects 

Bitte bitte helfen!

+2

Willkommen bei SO. Bitte lesen [mcve]. Bitte geben Sie einen Code hier .. – sjsam

+0

Mit Danksagungen sjsam. Will etwas Code hier setzen, sobald ich im Stapelcode gut bin :) –

+2

Sie können _good im Stapelcodieren nicht werden, ohne zu versuchen (und zu verwechseln :)) – JosefZ

Antwort

1

Hier ist ein kommentierte Batch-Code für diese Aufgabe:

@echo off 
setlocal 

rem Define source and backup path. 
set "SourcePath=C:\machines\models" 
set "BackupPath=E:\backup" 

rem Get current date in format YYYY-MM-DD independent on local date format. 
for /F "skip=1 tokens=1 delims=." %%T in ('%SystemRoot%\System32\wbem\wmic.exe OS get localdatetime') do set LocalDateTime=%%T & goto ReformatDate 
:ReformatDate 
set "YearMonthDay=%LocalDateTime:~0,4%-%LocalDateTime:~4,2%-%LocalDateTime:~6,2% 

rem For each subfolder in source path check if there is a subfolder "defects". 
rem If subfolder "defects" exists, copy all files and subfolders of "defects" 
rem to the appropriate backup directory with current date and subfolder name 
rem in source folder path. Then remove the subfolder "defects" in source 
rem folder even if being completely empty to avoid processing this folder 
rem again when not being recreated again in the meantime. 

for /D %%# in ("%SourcePath%\*") do (
    if exist "%%#\defects\*" (
     %SystemRoot%\System32\xcopy.exe "%%#\defects\*" "%BackupPath%\%YearMonthDay%\%%~nx#_defects\" /H /I /K /Q /R /S /Y >nul 
     rd /Q /S "%%#\defects" 
    ) 
) 
endlocal 

Run einmal in Eingabeaufforderung Fenstern wmic OS get localdatetime zu sehen, was dieser Befehl gibt, besser zu verstehen, wie das aktuelle Datum YYYY-MM-DD im Format bestimmt wird. Es wäre schneller, %DATE% zu verwenden, aber das Format der Datumszeichenfolge von %DATE% hängt von dem in den Windows-Regions- und Spracheinstellungen festgelegten Land ab und erfordert daher Kenntnis des Datumszeichenkettenformats auf dem Computer, auf dem diese Batchdatei ausgeführt wird.

Der Befehl XCOPY mit den verwendeten Optionen nicht den Unterordner in Sicherungsverzeichnis erstellen, wenn ein defects Unterordner in einem Verzeichnis models ist, sondern in ganzem defects Unterordner Baum ist es nicht zuletzt auf 1 Datei zu kopieren.

Alternativer Code mit Umgebungsvariable DATUM mit der Erwartung, dass der erweiterte Datumsstring endet mit: MM/DD/YYYY, z. Tue 05/17/2016, erklärt im Detail in Antwort auf:
What does %date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2% mean?

@echo off 
setlocal 

rem Define source and backup path. 
set "SourcePath=C:\machines\models" 
set "BackupPath=E:\backup" 

rem Get current date in format YYYY-MM-DD depending on local date format. 
set "YearMonthDay=%DATE:~-4,4%-%DATE:~-10,2%-%DATE:~-7,2%" 

rem For each subfolder in source path check if there is a subfolder "defects". 
rem If subfolder "defects" exists, copy all files and subfolders of "defects" 
rem to the appropriate backup directory with current date and subfolder name 
rem in source folder path. Then remove the subfolder "defects" in source 
rem folder even if being completely empty to avoid processing this folder 
rem again when not being recreated again in the meantime. 

for /D %%# in ("%SourcePath%\*") do (
    if exist "%%#\defects\*" (
     %SystemRoot%\System32\xcopy.exe "%%#\defects\*" "%BackupPath%\%YearMonthDay%\%%~nx#_defects\" /H /I /K /Q /R /S /Y >nul 
     rd /Q /S "%%#\defects" 
    ) 
) 
endlocal 

für die verwendeten Befehle verstehen und wie sie arbeiten, eine Eingabeaufforderung öffnen, führen Sie dort die folgenden Befehle ein, und für jede vollständig alle Hilfeseiten angezeigt lesen Befehl sehr sorgfältig.

  • echo /?
  • endlocal /?
  • for /? ... erklärt auch %%~nx# (Name (und Erweiterung) von Modellen Unterordner).
  • if /?
  • rd /?
  • set /?
  • setlocal /?
  • wmic.exe OS get /?
  • xcopy /?

Siehe auch den Microsoft Artikel über Using command redirection operators die Bedeutung von >nul zu verstehen.

Warum %%~nx# und nicht nur %%~n# als ein Ordner nicht über eine Dateierweiterung?

Der Windows-Befehlsprozessor ermittelt nicht, ob eine Zeichenfolge ein Ordner oder ein Dateiname ist. Alles nach dem letzten Backslash wird als Dateiname interpretiert, unabhängig davon, ob es sich um den Namen einer Datei oder eines Ordners handelt. Und alles nach dem letzten Punkt nach dem letzten umgekehrten Schrägstrich in der Zeichenfolge wird als Dateierweiterung interpretiert, auch wenn dies bedeutet, dass der mit %~n referenzierte Ordner- oder Dateiname eine leere Zeichenfolge ist, da der Ordner/Dateiname mit einem Punkt beginnt und keinen mehr enthält Punkt wie viele "versteckte" Dateien auf * nix-Systemen haben, z .htaccess. Daher sollte %~nx immer verwendet werden, wenn der gesamte Name eines Ordners oder einer Datei in einer Befehlszeile benötigt wird.

+0

Ok die Ausgabe für Echo% DATUM% ist Di 05/17 /. Gibt es eine bessere Möglichkeit, das Datum als Verzeichnis zu verwenden? Ich bevorzuge die Verwendung von Datum, ich werde suchen und lesen Sie die Links, die Sie gaben. Danke :) –

+0

Es wurde ein alternativer Stapelcode mit dem aktuellen Datum im Format 'YYYY-MM-DD' für den Verzeichnisnamen hinzugefügt, der aus der Umgebungsvariablen __DATE__ im Format 'abgekürzter Wochentag MM/TT/JJJJ', z. 'Di 17.05.2016'. – Mofi

0

Hier ist mein kommentierten Code. Mofi ist schneller (kein Platz für alte Männer ...)

Verwenden robocopy command eher als deprecated xcopy.

Hinweis /L Schalter in robocopy Befehl: Liste - nur nicht kopieren, Zeitstempel oder löschen Sie alle Dateien. Entfernen Sie /L Switch nicht früher als Debugging.

@ECHO OFF 
SETLOCAL EnableExtensions 
rem obtain %_currentdate% variable in locale independent yyyymmdd format 
for /f "tokens=2 delims==" %%G in (
    'wmic OS get localdatetime /value^|find "="') do set "_currentdate=%%G" 
set "_currentdate=%_currentdate:~0,8%" 
rem show %_currentdate% variable for debugging purposes 
set _currentdate 

rem appoint source and target directories 
set "_sourcedir=c:\machines\models" 
set "_targetdir=E:\backup\%_currentdate%" 

for /F "delims=" %%G in ('dir /B /AD "%_sourcedir%\"') do (
    set "_notEmpty=" 
    rem check if `defects` folder exists 
    if exist "%_sourcedir%\%%G\defects\*" (
    rem credit and tribute to DBenham in https://stackoverflow.com/a/10818854/3439404 
    rem check if a folder contains at least one file 
    >nul 2>nul dir /a-d "%_sourcedir%\%%G\defects\*" && (set "_notEmpty=f") 
    rem check if a folder or any of its descendents contain at least one file 
    >nul 2>nul dir /a-d /s "%_sourcedir%\%%G\defects\*" && (set "_notEmpty=f") 

    if defined _notEmpty (
     rem create target directory silently; suppress error message 'already exists' 
     md "%_targetdir%\%%G_defects\" >NUL 2>&1 

     rem move content of %_sourcedir%\%%G\defects\* to %_targetdir%\%%G_defects\ 
     robocopy "%_sourcedir%\%%G\defects" "%_targetdir%\%%G_defects" /S /E /MOVE /L 

     rem recreate source directory deleted (moved) by robocopy 
     md "%_sourcedir%\%%G\defects\" >NUL 2>&1 
    ) else (
     echo nothing to do in %_sourcedir%\%%G\defects 
    ) 
) else (
     echo nothing to do in %_sourcedir%\%%G 
) 
) 

Kredite und Tribut an DBenham in this answer (überprüfen, ob ein Ordner ist oder nicht leer).

+0

Hallo @josefZ, leider unterstützt die Maschine (XP) die Robocopy nicht, ich schätze deine Hilfe. Wird Ihren Code studieren, da er in zukünftigen Batch-Codes hilfreich sein könnte. Schätze deine Hilfe :) –

Verwandte Themen