Das Dos-Skript funktioniert auf einem Computer einwandfrei und nicht auf anderen. Warum?

1

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!

jaap
quelle
Hier scheint es zu funktionieren. Schlagen Sie vor, dass Sie Debuggen Ihrer Batchdateien
DavidPostill

Antworten:

0

Mit dem gleichen Ansatz

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /d %%a in (*) do for /f "tokens=1,5" %%b in ('
        dir /a-d "%%~fa\*" 2^> nul ^| findstr /b /c:"  " ^|^| echo 0
    ') do if "%%c"=="" echo %%~fa : %%b

Dieser Wille

  • Nehmen Sie für jeden Ordner ( for /d) eine Referenz und speichern Sie sie in einem %%aaustauschbaren Parameter
  • Führen Sie einen dirBefehl mit dem vollständigen Pfad des Ordners aus%%~fa
  • Verwenden Sie eine Pipe ( |), um die Liste zu filtern und nur die Zeilen abzurufen, die mit zwei Leerzeichen beginnen (die Fußzeilen).
  • Wenn keine Zeilen gefunden werden (dh der dirBefehl ist fehlgeschlagen), wird eine 0 ausgegeben
  • Die von der erzeugten Zeilen dir | findstrwerden mit einem for /fBefehl 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.
  • Wenn das fünfte Element leer ist, enthält diese Zeile Informationen zu den Dateien und nicht zu den Ordnern. Geben Sie daher den Ordnerpfad und die darin enthaltenen Dateien als Echo ein

Das Problem bei diesem Ansatz ist, dass das dir | findstrfür jeden der Unterordner ausgeführt wird. Für eine schnellere Lösung

robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs

Dies 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 ( /eum Ordner mit 0 Dateien einzuschließen), aber nur zwei Ebenen zu verarbeiten ( /lev:2den 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

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /f "tokens=1,*" %%a in ('
        robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
    ') do echo %%~fb : %%a

Mit a for /fwird der vorherige robocopyBefehl verarbeitet, wobei die Zeile in zwei Token aufgeteilt wird. Der erste Befehl enthält die Anzahl der Dateien und wird in gespeichert. %%aDer zweite Befehl enthält den Rest der Zeile und wird in gespeichert %%b. Für jede Zeile in der Ausgabe des inneren robocopyBefehls wird der Code in der doKlausel ausgeführt: Geben Sie einfach ein Echo ein, um die beiden Token in umgekehrter Reihenfolge zu trösten.

MC ND
quelle
Dieses komplexe DOS-Kommandozeilen-Batch-Skript ist immer noch Abracadabra. Ich kann den Unterschied zwischen dem einen und dem anderen wirklich nicht verstehen. Die ersten beiden arbeiten an allen Maschinen, das ist für mich das Wichtigste. Für die Robokopie: Sehr nützliche, wenn auch nicht nachvollziehbare Verwendung, auch wenn alle Parameter im Benutzerhandbuch eingecheckt wurden.
Jaap
@jaap, Antwort aktualisiert.
MC ND
0

Installierte oder geänderte Windows-Anzeigesprache . Ihr Skript ist sprachabhängig. Zum Beispiel dirBefehl zeigen Statistiken wie Soubor(ů)statt File(s)auf dem tschechische Fenster.

dir |find "Files(s)"dann setzt %ERRORLEVEL%auf 1:

FINDwird %ERRORLEVEL%wie folgt eingestellt:

  • 0 Zeichenfolge in mindestens einer der Dateien gefunden;
  • 1 Zeichenkette nicht gefunden;
  • 2Wenn Dateien in der Liste nicht vorhanden sind oder wenn keine Dateien mit einer Platzhaltermaske übereinstimmen. Ein ungültiger Schalter ist angegeben.

Beachten Sie außerdem, dass "Datei (en)" ein gültiger Ordnername ist. Daher könnte Ihr Skript angezeigt werden

==>md "File(s)"

==>D:\bat\SU\935171.bat
a b: 3
File(s): Directory
FooBar: 0
FooFoo: 4
JosefZ
quelle
Versteh nicht, was du mir erklären willst.
Jaap