
Ich versuche, eine Lösung zu finden, mit der ich alle Ordner in einem Verzeichnis scannen und in diesen Ordnern eine ZIP-Datei mit dem Inhalt des ersten/einzigen Unterordners erstellen kann.
Hier ist ein Beispiel für Ordner/Struktur/Hierarchie
I:\Unsorted\Sony - PlayStation Vita\NoNpDrm Physical\SENRAN KAGURA SV [PCSE00398] [NTSC]\PCSE00398
Ich möchte den Inhalt PCSE00398
in einer ZIP-Datei (mit dem gleichen Namen) komprimieren und im I:\Unsorted\Sony - PlayStation Vita\NoNpDrm Physical\SENRAN KAGURA SV [PCSE00398] [NTSC]
Ordner belassen.
Antwort1
@echo off
set "_flag=a -ep1 -m5 -cfg- -y -o+"
cd /d "%~dp0" && for /d /r "I:\test\." %%i in (*
)do 2>nul tree.com /a "%%~dpnxi"|findstr /bl \\--- >nul || (
"%ProgramFiles%\WinRAR\Rar.exe" %_flag% "%%~i" "%%~dpni" |find/i ".rar" )
Um die letzte Ebene eines Unterordners zu erreichen, muss lediglich geprüft werden, ob in jedem Unterordner ein weiterer Ordner vorhanden ist. Andernfalls muss dieser Ordner der letzten Ebene komprimiert werden.
Sie können die Schleife verwenden for /d /r
, die alle Ordner durchläuft, und in jedem Ordner innerhalb der Schleife den tree
Befehl zusammen mit verwenden findstr
, um zu überprüfen, ob der aktuelle Ordner weitere Unterordner hat oder nicht.
FOR /R - Loop through files (recursively) FOR /D - Loop through several folders/directories
The option /D /R is undocumented, but can be a useful combination, while it will recurse through all subfolders the wildcard will only match against Folder/Directory names (not filenames) Note: Source linked to ss64.com
Sie können die in allen Unterordnern rekursiv verwenden mittree "current_looping_folder" /a
for /d /r
und durch Überprüfen jeder Ausgabe mitfindstr "Zeichenfolge"("\---"
) Weiterleitung zum Betreiber||
und Maßnahmen ergreifen (Rar
) Wennnicht gefundendiese Zeichenfolge \---
in der tree
Befehlsausgabe \---Last Folder
:
Folder PATH listing
Volume serial number is A0AD-DC56
F:\SUPER_USER\Q1599429
\---Last Folder
Die obige Ausgabe stammt aus dem Ordner, in dem ich mich befinde, F:\SUPERUSER\Q1599429
und hier haben wir den Last Folder
Unterordner. Wenn ich mich jedoch im F:\SUPER_USER\Q1599429\Last Folder
Unterordner befinde, erhalte ich die folgende Ausgabe:
Folder PATH listing
Volume serial number is A0AD-DC56
F:\SUPER_USER\Q1599429\Last Folder
No subfolders exist
Wenn findstr
die Zeichenfolge nicht gefunden wird "\---"
, habe ich im aktuellen Ordner keinen Unterordner. Dies ist der letzte Ordner:
F:\SUPER_USER\Q1599429\Last Folder
In diesem Fall schlägt der Befehl fehl, wenn kein Unterordner vorhanden ist. Lassen Sie den Operator den Befehl dann genau in Ihrem letzten Ordner auf der aktuellen Ordnerebene ausführen …tree "Actual_Loop_Folder" /a | findstr "\---"
||
Rar.exe
- Beob.: 1Der Zusatz
\
wird benötigt, um das Zeichen\
infindstr
... tree.com /a "%%~dpnxi"|findstr /bl \\--- ...
- Obs.: 2Hiermit soll die mechanische Funktionsweise des Operators veranschaulicht werden
||
:
command1 || command2
execute command1 || only execute command2 (if) command1 fails
if tree folder /a fails || there is no subfolder in it
there is no subfolder in it || this is the the last subfolder
this is the last subfolder || run rar flags in the \Last Folder
tree /a "%~fi"|findstr "\---">nul || Rar "I:\Unsorted\...\PCSE00398"
- Obs.: 3Wenn Sie mit
WinRar.exe
stattdessenRar.exe
einfach entfernen/ersetzen/bearbeiten:
"%ProgramFiles%\WinRAR\Rar.exe" %_flag% "%%~i" "%%~dpni" |find/i ".rar"
"%ProgramFiles%\WinRAR\WinRar.exe" %_flag% "%%~i" "%%~dpni"
- Obs.: 4Sie können Ihre benutzerdefinierten Flags/Switches für Ihre
Rar/WinRar
Befehl:
<Commands>
a == Add files to archive
<Switches>
cfg- == Disable read configuration
ep1 == Exclude base directory from names
m<0..5> == Set compression level (0-store...3-default...5-maximal)
o[+|-] == Set the overwrite mode
y == Assume Yes on all queries
-----------------------------------------------------------------------
set "_flag=a -ep1 -m5 -cfg- -y -o+"
- Weiterführende Literatur:
[√]For-Schleife