2008-09-02 3 views
154

У меня есть набор базовых имен файлов, для каждого имени «f» есть ровно два файла: «f.in» и «f.out». Я хочу написать пакетный файл (в Windows XP), которая проходит через все имена файлов, для каждого из них следует:Как закодировать файлы, соответствующие шаблону в пакетном файле

  • дисплей базовое имя «е»
  • Выполнить действие на «f.in»
  • Выполните другое действие «» f.out

у меня нет никакого способа перечислить множество базовых имен файлов, кроме как искать * .in (или * .out), например.

+7

Я действительно не хочу быть этим парнем после голосования 111/0, но в вашем вопросе не отображается какой-либо вопрос. – Blauhirn 2016-04-24 14:57:26

ответ

234

Если у вас есть две программы, которые обрабатывают эти два файла, process_in.exe и process_out.exe:

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

%% ~ nf - модификатор замещения, который расширяет% f только до имени файла. Другие модификаторы в https://technet.microsoft.com/en-us/library/bb490909.aspx (в середине страницы) или только в следующем ответе.

4

Самый простой способ, как я вижу, это использовать цикл for, который вызывает второй пакетный файл для обработки, передавая этот второй файл базовому имени.

В соответствии с /? help, basename можно извлечь, используя опцию nifty ~ n. Таким образом, базовый сценарий будет гласить:

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

Тогда в process.cmd, предположим, что% 0 содержит имя базового и действовать соответствующим образом. Например:

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

Там может быть лучшим способом сделать это в одном сценарии, но я всегда был немного туманно о том, как вытащить из нескольких команд в один цикл в пакетном файле.

EDIT: Это фантастика! Я как-то пропустил страницу в документах, которые показали, что вы можете делать многострочные блоки в цикле FOR. Я собираюсь идти придется вернуться и переписать некоторые пакетные файлы теперь ...

3

Существует инструмент, как правило, используется в MS-серверов (насколько я помню) называется forfiles:

Ссылка выше содержит а также ссылку на страницу загрузки microsoft.

68

Вы можете использовать эту линию, чтобы напечатать содержимое рабочего стола:

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

После того как вы %%I переменного это легко выполнить команду на ней (просто заменить слово эха с программой)

Кроме того, замена для переменных ссылок была усовершенствована Теперь вы можете использовать следующий дополнительный синтаксис:

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

В приведенных выше примерах %I и PATH могут быть заменены другими действительными значениями . Синтаксис %~ завершается действительным именем переменной FOR. Выбор имен переменных верхнего регистра, таких как %I, делает его более читаемым и позволяет избежать путаницы с модификаторами, которые не чувствительны к регистру.

Вы можете получить полную документацию, набрав FOR /?

+0

Это не работает. `%% Я был неожиданным в это время.` – Brad 2016-09-30 18:14:52

+2

@Brad, если вы используете это в командной строке (а не в пакетном файле), затем используйте `% I` вместо` %% I` – doubleDown 2017-09-10 04:32:09

3

Расширение на Nathans должность. Следующее выполнит задание в одном пакетном файле.

@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 
0

Код ниже фильтрует имена файлов, начиная с данной подстроки. Это может быть изменен, чтобы соответствовать различным потребностям, работая по добыче subfname подстроки и 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 
0

Повторяя f.in и f.out будет отделить понятие о том, что в цикле и что не петля при использовании в для цикла/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 
) 

Хотя вы не спрашивали, хороший способ передать команды в f.in и f.out бы ...

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

Ссылка на все команды Windows XP: link

Приносим извинения, если я не ответил правильно. Вопрос был очень трудным для меня.

Смежные вопросы