Alles was Sie tun müssen, ist mehrere if
Aussagen zu machen, denke ich. In Ihrer Schleife würde es so aussehen:
IF exist "%%G\*.pdf" ( move /Y "%%G\*.pdf" "%_dest%\" echo %%G>>"%_dest%\results-log.log ) IF exist "%%G\*.exe" ( move /Y "%%G\*.exe" "%_dest%\" echo %%G>>"%_dest%\results-log.log ) IF exist "%%G\*.avi" ( move /Y "%%G\*.avi" "%_dest%\" echo %%G>>"%_dest%\results-log.log )
Wenn Sie möchten, dass die Nachricht nichts verschiebt, können Sie immer eine Variable setzen, wenn sie in eine dieser IF
Anweisungen gerät und überprüfen, ob sie gesetzt ist.
Ich bin nicht sicher, was /B
ist, das sieht für mich nicht richtig aus. Ich denke, du hast recht mit /y
.
Das G
kann ein beliebiges Zeichen sein, aber es kann nicht mehr als ein Zeichen sein. G
ist was normalerweise verwendet wird.
Ich würde vorschlagen, nach solchen Powershell-Skripten zu suchen. Meiner Meinung nach ist es sauberer und einfacher, solche Dinge mit weniger Codezeilen auszuführen. Möglicherweise gibt es einen Befehl zum Verschieben aller Dateien mit mehreren Erweiterungen gleichzeitig. Ich verstehe jedoch, dass in den meisten DOS-Versionen normalerweise keine Syntax zum Verschieben verfügbar ist.
BEARBEITEN:
Ich habe dies lokal getestet und es scheint zu funktionieren, was Sie tun. Sie müssen es für Ihren speziellen Fall anpassen.
@ECHO OFF SETLOCAL EnableExtensions enabledelayedexpansion set _parent=c:\logs\cache\ set _dest=c:\archive\ set found=0 for /R %_parent% %%G in (.) do ( set found=0 IF exist "%%G\*.pdf" ( move /Y "%%G\*.pdf" "%_dest%\" set found=1 ) IF exist "%%G\*.exe" ( move /Y "%%G\*.exe" "%_dest%\" set found=1 ) IF exist "%%G\*.avi" ( move /Y "%%G\*.avi" "%_dest%\" set found=1 ) IF !found!==1 ( rd /s /q "%%G" echo %%G>>"%_dest%\results-log.log" ) ) endlocal
Wenn Sie die /D
Option in der for
Schleife verwenden, wird das aktuelle Verzeichnis, in dem Sie das Skript ausführen, an die %%G
Variable angehängt, die meiner Meinung nach nicht das ist, was Sie wollen. Die Art und Weise, wie ich sie oben geschrieben habe, besagt im Wesentlichen, dass alle Ordner im übergeordneten Verzeichnis rekursiert und %%G
auf diesen Speicherort gesetzt werden (.)
.
Sie müssen auch das hinzufügen, enabledelayedexpansion
damit Sie die found
Variable in verschiedenen Blöcken verwenden können. Dann müssen Sie sie aufrufen, !found!
anstatt sie %found%
zu verwenden. Nur eine seltsame Art von Batch-Scripting.
Wenn Ihnen diese Syntax wirklich komisch vorkommt, sind Sie nicht alleine. Sie müssen nur nachforschen und Ihre eigenen Tests durchführen, um zu sehen, was passiert, bis Sie das bekommen, was Sie wollen. Wenn Sie in Powershell einsteigen, werden Sie hoffentlich das Debuggen mit Powershell-ISE und die verwendete Syntax viel einfacher finden.