Da ich nicht so gut mit Dos-Script umgehen kann, es aber gut gebrauchen kann, habe ich hier viele einfache Lösungen für Probleme gefunden, auf die ich stoße. Vor kurzem habe ich ein Skriptformular hierher kopiert, um die Anzahl der Dateien in Unterverzeichnissen zu zählen. Ich habe es leicht modifiziert, um es meinem Zweck anzupassen. Es ist jetzt wie folgt und funktioniert einwandfrei auf meinem Desktop, auf dem ich es komponiert habe:
FOR /D %%D IN ("*") DO (
FOR /F %%K IN ('DIR /A-D "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
ECHO %%D: %%K
)
)
Nun der seltsame Teil: Auf meinem Computer (dem, auf dem das Skript erstellt wurde) ist die Ausgabe wie erwartet, auf anderen Computern zählt der Zähler nicht und gibt Null als Ergebnis (was absolut falsch ist).
Auf allen Computern wird Windows 7 ausgeführt (für den Fachmann zählt, für die beiden anderen gilt Premium bzw. Professional).
Was passiert hier und wie korrigiere ich es?
Vielen Dank!
quelle
Antworten:
Mit dem gleichen Ansatz
Dieser Wille
for /d
) eine Referenz und speichern Sie sie in einem%%a
austauschbaren Parameterdir
Befehl mit dem vollständigen Pfad des Ordners aus%%~fa
|
), um die Liste zu filtern und nur die Zeilen abzurufen, die mit zwei Leerzeichen beginnen (die Fußzeilen).dir
Befehl ist fehlgeschlagen), wird eine 0 ausgegebendir | findstr
werden mit einemfor /f
Befehl behandelt. Wir werden das erste Token (die Anzahl der Dateien in der abgesetzten Zeile) und das fünfte Token (nur in der Fußzeile mit den Verzeichnisinformationen vorhanden) lesen.Das Problem bei diesem Ansatz ist, dass das
dir | findstr
für jeden der Unterordner ausgeführt wird. Für eine schnellere LösungDies ruft einfach auf
robocopy
, aber anstatt irgendetwas zu kopieren, fordern wir an, dass nichts kopiert wird und geben nur die Liste zurück, was verarbeitet werden soll (/nocopy /l
). Wir bitten Sie, aus dem aktuellen Ordner in den aktuellen Ordner zu kopieren, einschließlich identischer Dateien im Prozess (/is
), leere Unterordner zu verarbeiten (/e
um Ordner mit 0 Dateien einzuschließen), aber nur zwei Ebenen zu verarbeiten (/lev:2
den aktuellen Ordner und den darunter liegenden). ohne Generierung einer Dateiliste (/nfl
), ohne Jobheader (/njh
) und ohne Jobübersicht (/njs
)Das Ergebnis ist dieselbe Liste, jedoch mit dem Ordnernamen und der Anzahl der Dateien in geänderten Spalten
So behalten Sie das ursprüngliche Ausgabeformat bei
Mit a
for /f
wird der vorherigerobocopy
Befehl verarbeitet, wobei die Zeile in zwei Token aufgeteilt wird. Der erste Befehl enthält die Anzahl der Dateien und wird in gespeichert.%%a
Der zweite Befehl enthält den Rest der Zeile und wird in gespeichert%%b
. Für jede Zeile in der Ausgabe des innerenrobocopy
Befehls wird der Code in derdo
Klausel ausgeführt: Geben Sie einfach ein Echo ein, um die beiden Token in umgekehrter Reihenfolge zu trösten.quelle
Installierte oder geänderte Windows-Anzeigesprache . Ihr Skript ist sprachabhängig. Zum Beispiel
dir
Befehl zeigen Statistiken wieSoubor(ů)
stattFile(s)
auf dem tschechische Fenster.dir |find "Files(s)"
dann setzt%ERRORLEVEL%
auf1
:Beachten Sie außerdem, dass "Datei (en)" ein gültiger Ordnername ist. Daher könnte Ihr Skript angezeigt werden
quelle