Domanda

Ho una serie di nomi di file di base, per ogni nome "f" ci sono esattamente due file, "f.in" e "f.out".Voglio scrivere un file batch (in Windows XP) che esamini tutti i nomi di file, per ognuno dovrebbe:

  • Visualizza il nome della base 'f'
  • Esegui un'azione su 'f.in'
  • Esegui un'altra azione su 'f.out'

Non ho alcun modo per elencare l'insieme di nomi di file di base, se non cercare, ad esempio, *.in (o *.out).

È stato utile?

Soluzione

Supponendo che tu abbia due programmi che elaborano i due file, process_in.exe e process_out.exe:

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

%%~nf è un modificatore di sostituzione, che espande %f solo in un nome di file.Vedi altri modificatori in https://technet.microsoft.com/en-us/library/bb490909.aspx (a metà pagina) o solo nella risposta successiva.

Altri suggerimenti

Puoi utilizzare questa riga per stampare il contenuto del tuo desktop:

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

Una volta che hai il %%I variabile è facile eseguire un comando su di essa (basta sostituire la parola echo con il tuo programma)

Inoltre, la sostituzione di per riferimenti variabili è stata migliorata, ora è possibile utilizzare la seguente sintassi opzionale:

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

Negli esempi sopra %I e il percorso può essere sostituito da altri valori validi.IL %~ la sintassi termina con un nome di variabile FOR valido.Scegliere nomi di variabili maiuscole come %I lo rende più leggibile ed evita la confusione con i modificatori, che non sono sensibili al caso.

È possibile ottenere la documentazione completa digitando FOR /?

Il modo più semplice, per come la vedo io, è utilizzare un ciclo for che chiama un secondo file batch per l'elaborazione, passando a quel secondo file il nome base.

Secondo il per /?help, basename può essere estratto usando l'opzione nifty ~n.Quindi, lo script di base sarebbe:

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

Quindi, in process.cmd, presupponi che %0 contenga il nome base e agisci di conseguenza.Per esempio:

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

Potrebbe esserci un modo migliore per farlo in uno script, ma sono sempre stato un po' confuso su come estrarre più comandi in un singolo ciclo for in un file batch.

MODIFICARE:È fantastico!In qualche modo mi ero persa la pagina nei documenti che mostrava che si potevano creare blocchi su più righe in un ciclo FOR.Adesso devo tornare indietro e riscrivere alcuni file batch...

Esiste uno strumento solitamente utilizzato nei server MS (per quanto ricordo) chiamato forfiles:

Il collegamento sopra contiene la guida e un collegamento alla pagina di download di Microsoft.

Espansione Nathan inviare.Quanto segue eseguirà il lotto di lavoro in un file batch.

@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

Il codice seguente filtra i nomi dei file che iniziano con una determinata sottostringa.Potrebbe essere modificato per soddisfare esigenze diverse lavorando sull'estrazione della sottostringa subfname e sull'istruzione IF:

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

L'eco di f.in e f.out separerà il concetto di cosa mettere in loop e cosa non mettere in loop quando usato in un ciclo for /f.

::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
)

Anche se non l'hai chiesto, un buon modo per passare i comandi in f.in e f.out sarebbe quello di...

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

Un collegamento a tutti i comandi di Windows XP:collegamento

Mi scuso se non ho risposto correttamente.La domanda è stata molto difficile per me da leggere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top