2017-03-06 4 views
1

Sollte ein einfacher sein, aber einige Grund googeln und sogar mit ähnlichen Code aus anderen Projekten hilft mir nicht loszuwerden.FOR Schleife nicht durch Ordner-Struktur

ZIELE:
Batch-Datei im Root-USB-Stick saß ein Einzeiler enthalten, die rekursiv durchsucht alle Ordner auf dem Laufwerk wiederum und wo es eine gewisse SFX-Datei von Wildcard-Namen findet, aktualisieren Sie eine Datei darin.

PROBLEM:
Aktuelle Code funktioniert, aber nur für die erste Datei findet es und nur wiederholt immer und immer wieder, fällt nie auf den nächsten Ordner, in dem es eine andere Datei.

Es gibt etwa 10 Ordner auf dem Laufwerk und 5 haben eine Datei in dem müssen regelmäßig ein Update, eg_file1.exe, eg_file2.exe, eg_file3.exe, eg_file4.exe, eg_file5.exe. Ich könnte 5 separate Codezeilen haben, bevorzuge aber ein effizienteres, weniger überladenes Skript.

Ich bin sicher, ich vermisse etwas offensichtlich, so dass jeder, der es zeigen oder unterstützen kann, eine große Hilfe sein würde.

Code-Schnipsel:

pushd %~dp0 

for /r %%f in ("*EG_*.exe") DO ("%~dp07za.exe" u "%%~ff" "%~dp0configs\config.cfg") 

pause 
exit 
+2

Hinweis: https://stackoverflow.com/documentation/batch-file/3695/for-loops- In-Batch-Dateien # t = 201703061006249850917 – DavidPostill

+0

danke diesen nützlichen Link, habe für die Zukunft gespeichert Die Referenz. – Tika9o9

Antwort

2

Der Code betreffende Charge rekursiv für *EG_*.exe sucht und aktualisiert alle Dateien gefunden, die die gleiche Datei wieder bei der Verarbeitung führt und wieder, weil die Liste der Dateien durch das Wildcard-Muster angepasst ändert sich während der Verarbeitung jeder Datei, die dem Muster entspricht.

Die Lösung verwendet den Befehl DIR, um zuerst die vollständige Liste aller Dateien zu erhalten, die dem Platzhaltermuster entsprechen, und im nächsten Schritt diese Liste zu bearbeiten. In diesem Fall spielt es keine Rolle, dass die gefundenen Dateien aktualisiert werden, da die Liste der Dateien bereits vollständig von DIR Befehl ausgegeben wird, bevor FOR die Dateiliste verarbeitet.

pushd "%~dp0" 
for /F "delims=" %%I in ('dir /A-D /B /ON /S "*EG_*.exe"') do "%~dp07za.exe" u "%%~fI" "%~dp0configs\config.cfg" 
popd 
exit /B 

Dies ist besonders wichtig, auf USB-Sticks ein FAT-Dateisystem verwenden, auf dem die Liste der Dateien eine Wildcard Musterabgleich nicht automatisch von NTFS als erledigt auf NTFS-Partitionen sortiert ist. Auf FAT-Partitionen wird die Liste der Dateien zurückgegeben, die einem Platzhaltermuster entsprechen, wie in der Dateizuordnungstabelle der Partition/des Laufwerks gespeichert, die sich bei jeder Datei-/Verzeichnisaktualisierung ändert. Dies kann durch Ausführen einer einfachen DIR in einem Verzeichnis auf einer FAT-Partition (FAT16, FAT32, exFAT) gesehen werden, ändern Sie eine Datei in diesem Verzeichnis und führen Sie noch einmal DIR. Die Reihenfolge der Dateinamen der zweiten DIR Ausführung unterscheidet sich von der Reihenfolge der Dateinamen der ersten DIR Ausführung, obwohl die gleichen Dateinamen ausgegeben werden, da keine Datei im Verzeichnis hinzugefügt oder gelöscht wurde, da nur eine Datei geändert (aktualisiert) wurde.

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • dir /?
  • exit /?
  • for /?
  • popd /?
  • pushd /?
+0

Perfekt! Vielen Dank. Erklärt, warum das Verhalten bei Verwendung von ähnlich in einem anderen Ordner mit (NTFS) anders war – Tika9o9