Frage

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 Batchdatei (in Windows XP) schreiben, die alle Dateinamen durchgeht. Für jeden einzelnen sollte Folgendes gelten:

  • Den Basisnamen „f“ anzeigen
  • Führen Sie eine Aktion für „f.in“ aus.
  • Führen Sie eine weitere Aktion für „f.out“ aus.

Ich habe keine Möglichkeit, die Basisdateinamen aufzulisten, außer beispielsweise nach *.in (oder *.out) zu suchen.

War es hilfreich?

Lösung

Angenommen, Sie haben zwei Programme, die die beiden Dateien „process_in.exe“ und „process_out.exe“ verarbeiten:

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)

%%~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.

Andere Tipps

Mit dieser Zeile können Sie den Inhalt Ihres Desktops ausdrucken:

FOR %%I in (C:\windows\desktop\*.*) DO echo %%I 

Sobald Sie das haben %%I Variable ist es einfach, einen Befehl darauf auszuführen (ersetzen Sie einfach das Wort echo durch Ihr Programm)

Darüber hinaus wurde die Substitution von variablen Referenzen verbessert, Sie können jetzt die folgende optionale Syntax verwenden:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only (directory with \)
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string


[https://ss64.com/nt/syntax-args.html][1]

In den obigen Beispielen %I und Pfad kann durch andere gültige Werte ersetzt werden.Der %~ Die Syntax wird durch einen gültigen FOR-Variablennamen abgeschlossen.Auswahl von Variablennamen in Großbuchstaben wie %I macht es lesbarer und vermeidet Verwirrung mit den Modifikatoren, die nicht sensibel sind.

Die vollständige Dokumentation erhalten Sie durch Eingabe FOR /?

Meiner Meinung nach 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 raffinierten Option ~n extrahiert werden.Das Basisskript würde also lauten:

for %%f in (*.in) do call process.cmd %%~nf

Gehen Sie dann in „process.cmd“ davon aus, dass %0 den Basisnamen enthält, und handeln Sie entsprechend.Zum Beispiel:

echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt

Es gibt möglicherweise eine bessere Möglichkeit, dies in einem Skript zu tun, aber ich war mir immer etwas unklar, wie man mehrere Befehle in einer einzigen for-Schleife in einer Batchdatei abruft.

BEARBEITEN:Das ist fantastisch!Ich hatte irgendwie die Seite in den Dokumenten übersehen, die zeigte, dass man mehrzeilige Blöcke in einer FOR-Schleife erstellen kann.Ich muss jetzt zurückgehen und einige Batchdateien neu schreiben ...

Es gibt ein Tool, das normalerweise auf MS-Servern verwendet wird (soweit ich mich erinnern kann). forfiles:

Der obige Link enthält Hilfe sowie einen Link zur Microsoft-Downloadseite.

Erweitern Nathans Post.Im Folgenden wird die Aufgabe in einer Batchdatei erledigt.

@echo off

if %1.==Sub. goto %2

for %%f in (*.in) do call %0 Sub action %%~nf
goto end

:action
echo The file is %3
copy %3.in %3.out
ren %3.out monkeys_are_cool.txt

:end

Der folgende Code filtert Dateinamen, die mit der angegebenen Teilzeichenfolge beginnen.Es könnte an unterschiedliche Anforderungen angepasst werden, indem an der Subfname-Substring-Extraktion und der IF-Anweisung gearbeitet wird:

echo off
rem filter all files not starting with the prefix 'dat'
setlocal enabledelayedexpansion
FOR /R your-folder-fullpath %%F IN (*.*) DO (
set fname=%%~nF
set subfname=!fname:~0,3!
IF NOT "!subfname!" == "dat" echo "%%F"
)
pause

Das Echo von f.in und f.out trennt das Konzept, was wiederholt werden soll und was nicht, wenn es in einer for /f-Schleife verwendet wird.

::Get the files seperated
echo f.in>files_to_pass_through.txt
echo f.out>>files_to_pass_through.txt

for /F %%a in (files_to_pass_through.txt) do (
for /R %%b in (*.*) do (
if "%%a" NEQ "%%b" (
echo %%b>>dont_pass_through_these.txt
)
)
)
::I'm assuming the base name is the whole string "f".
::If I'm right then all the files begin with "f".
::So all you have to do is display "f". right?
::But that would be too easy.
::Let's do this the right way.
for /f %%C in (dont_pass_through_these.txt)
::displays the filename and not the extention
echo %~nC
)

Obwohl Sie nicht gefragt haben, wäre eine gute Möglichkeit, Befehle an f.in und f.out zu übergeben, ...

for /F %%D "tokens=*" in (dont_pass_through_these.txt) do (
for /F %%E in (%%D) do (
start /wait %%E
)
)

Ein Link zu allen Windows XP-Befehlen:Verknüpfung

Ich entschuldige mich, wenn ich das nicht richtig beantwortet habe.Die Frage war für mich sehr schwer zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top