Ich habe eine Reihe von Basisdateinamen, für jeden Namen 'f' gibt es genau zwei Dateien, 'f.in' und 'f.out'. Ich möchte eine Batch-Datei (in Windows XP) schreiben, die alle Dateinamen durchläuft, für jeden sollte es:
- Zeigen Sie den Basisnamen 'f' an.
- Führen Sie eine Aktion für 'f.in' aus.
- Führen Sie eine weitere Aktion für 'f.out' aus.
Ich habe keine andere Möglichkeit, die Basisdateinamen aufzulisten, als beispielsweise nach * .in (oder * .out) zu suchen.
command-line
windows-xp
batch-file
Luke Halliwell
quelle
quelle
Antworten:
Angenommen, Sie haben zwei Programme, die die beiden Dateien verarbeiten, process_in.exe und process_out.exe:
%% ~ nf ist ein Substitutionsmodifikator, der% f nur auf einen Dateinamen erweitert. Weitere Modifikatoren finden Sie unter https://technet.microsoft.com/en-us/library/bb490909.aspx (in der Mitte der Seite) oder einfach in der nächsten Antwort.
quelle
%%f
warum ist es%%~nf
später?~
Modifikatoren, um Dinge zu tun, wie in meinem Beispiel, nur den Dateinamen abrufen. Es ist nur eine Gewohnheit für mich, das zu benutzen, falls der*
den vollen Weg macht oder so. Es gibt eine Handvoll dieser Modifikatoren (in der Mitte der Seite): microsoft.com/resources/documentation/windows/xp/all/proddocs/…Mit dieser Zeile können Sie den Inhalt Ihres Desktops drucken:
Sobald Sie die
%%I
Variable haben, ist es einfach, einen Befehl darauf auszuführen (ersetzen Sie einfach das Wort Echo durch Ihr Programm).Darüber hinaus wurde die Ersetzung von FOR-Variablenreferenzen verbessert. Sie können jetzt die folgende optionale Syntax verwenden:
https://ss64.com/nt/syntax-args.html
In den obigen Beispielen
%I
kann PATH durch andere gültige Werte ersetzt werden. Die%~
Syntax wird durch einen gültigen FOR-Variablennamen beendet. Wenn Sie Variablennamen in Großbuchstaben wie%I
auswählen, wird die Lesbarkeit verbessert und Verwechslungen mit den Modifikatoren vermieden, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird.Sie können die vollständige Dokumentation durch Eingabe erhalten
FOR /?
quelle
%%I was unexpected at this time.
%I
anstelle von%%I
Aus meiner Sicht ist es am einfachsten, eine for-Schleife zu verwenden, die eine zweite Batchdatei zur Verarbeitung aufruft und dieser zweiten Datei den Basisnamen übergibt.
Nach dem für /? Hilfe, Basisname kann mit der Option nifty ~ n extrahiert werden. Das Basisskript würde also lauten:
Nehmen Sie dann in process.cmd an, dass% 0 den Basisnamen enthält, und handeln Sie entsprechend. Beispielsweise:
Es gibt vielleicht einen besseren Weg, dies in einem Skript zu tun, aber ich war immer ein bisschen verschwommen, wie man mehrere Befehle in einer einzigen for-Schleife in einer Batch-Datei abruft.
EDIT: Das ist fantastisch! Ich hatte irgendwie die Seite in den Dokumenten verpasst, die zeigte, dass Sie mehrzeilige Blöcke in einer FOR-Schleife ausführen können. Ich werde jetzt zurückgehen und einige Batch-Dateien neu schreiben müssen ...
quelle
Aufbauend auf Nathans Post. Im Folgenden wird das Auftragslos in einer Batchdatei ausgeführt.
quelle
Es gibt ein Tool, das normalerweise in MS-Servern verwendet wird (soweit ich mich erinnern kann) und forfiles heißt :
Der obige Link enthält Hilfe sowie einen Link zur Microsoft-Downloadseite.
quelle
Der folgende Code filtert Dateinamen, die mit der angegebenen Teilzeichenfolge beginnen. Es kann geändert werden, um verschiedenen Anforderungen zu entsprechen, indem an der Subnamen-Teilstring-Extraktion und der IF-Anweisung gearbeitet wird:
quelle
Wenn Sie f.in und f.out wiederholen, wird das Konzept getrennt, was in einer for / f-Schleife wiederholt werden soll und was nicht.
Obwohl Sie nicht gefragt haben, wäre eine gute Möglichkeit, Befehle an f.in und f.out zu übergeben, ...
Ein Link zu allen Windows XP-Befehlen: Link
Ich entschuldige mich, wenn ich dies nicht richtig beantwortet habe. Die Frage war für mich sehr schwer zu lesen.
quelle