- Windows Server 2012 cmd.exe box
- Мне нужно сделать командный файл, назовите его
get.bat
, чтобы обработать все каталоги, перечисленные вdlist.txt
который находится в том же каталоге, что иget.bat
. Имена каталогов - по одному на строку в dlist.txt. dlist.txt был создан с помощьюdir /b DIV_* > dlist.txt
. Эти DIV_ файлы на самом деле являются подкаталогами в директории, в которой запускается мой пакетный файл. - Я не могу использовать спецификацию файла в команде FOR, потому что мне нужно вручную отредактировать
dlist.txt
после его создания. Я не хочу обрабатывать все каталоги, такие какDIV_*
, только некоторые из них. - Создание
dlist.txt
с помощьюdir /w DIV_* > dlist.txt
означает, что у всех имен каталогов есть [], и я не могу это использовать. - В
get.bat
есть один параметр, который является базовым именем файла и содержит все результаты из командыfromxsf
. Расширение .txt будет добавлено командным файлом. - Мне нужно сделать несколько команд для каждого каталога в
dlist.txt
, некоторые из которых задают временное имя файла с именем% tempoutfile%, которое затем используется вfromxsf
. - Я прочитал несколько страниц, которые я нашел в Google, включая некоторые из Superuser, но примеры, которые могут работать для cmd.exe, не работали для меня. Может быть, Windows 2012 Server слишком стар? Я не могу это изменить, я должен работать с тем, что у меня есть.
fromxsf
который обрабатывает каждый каталог вdlist.txt
требуется каталог в качестве одного параметра после-cd
и временный выходной файл в качестве другого параметра, который является% tempoutfile%.- У нас, похоже, нет powershell или, по крайней мере, путь к нему не установлен.
Вот что я пробовал использовать цикл FOR:
set destdir=c:\tempdir
set outfile=%destdir%\%1.txt
FOR /F %%f in ('type dlist.txt') DO (
echo "--------------------"
echo Basedir=%%f should be directory
set tempoutfile=../%%f.txt
echo outfile=%destdir%\%outfile%
echo tempoutfile=%tempoutfile%
echo Processing dir %%f, to tempfile %tempfile%
pause
rem Below is the command to process the dir name in %%f to make a temp file in %tempoutfile%
fromxsf %tempoutfile% -cd %%f +m -nbs -Rep -nofrills
if exist "%destdir%" (
echo " " >> %outfile%
echo "{DIVNAME=%i}" >> %outfile%
rem Append %tempoutfile% to %outfile%.
type %tempoutfile% >> %outfile%
del %tempoutfile%
)
)
Для приведенного выше значения %% f всегда является первой строкой dlist.txt. Это не то, что я хочу.
То, что я делаю в цикле, выводит обработанное содержимое каталога во временный файл в% tempfile%, а затем объединяет содержимое% tempfile% в% destdir%\% outfile%. mycommand
требует входной каталог %% f в качестве аргумента командной строки. Я просто не могу перенаправить STDOUT и добавить вывод в% destdir%\% outfile%.
Несколько альтернативных циклов FOR, которые я пробовал:
FOR %%f in (dlist.txt) DO (
. В этом случае%%f
всегда является вторым именем dir вdlist.txt
и никогда не меняется.
Кто-нибудь знает, как это сделать?
Спасибо!
РЕДАКТИРОВАТЬ: Спасибо. Я понял это с помощью отложенного расширения и еще одного поста, который я нашел с помощью Google. Суть цикла в следующем: имена файлов содержатся в текстовом файле dlist.txt
одному имени в строке. Моя проблема заключалась в отсутствующей опции "tokens=*"
. Так же !переменная! запись должна использоваться КАЖДЫЙ раз в цикле. Цикл ниже также содержит операторы echo для отображения значений переменных.
setlocal EnableDelayedExpansion
set outfile=c:\temp\tempout.txt
del %outfile%
FOR /f "tokens=*" %%f in (dlist.txt) DO (
echo.
echo --------------------
set indir=%%f
echo Basediv indir=!indir!
echo Processing division !indir!
echo. >> %outfile%
echo {DIVNAME=!indir!} >> %outfile%
pause
fromxsf %outfile% -cd !indir! +m -nbs -Rep -nofrills -a
)
Ключевые вопросы в моем цикле
- Используйте переменную
%%f
только один раз за цикл и присвойте ееindir
. С этого момента используйте!indir!
переменная. - Я удалил использование
%tempoutfile%
потому что командаfromxsf
позволяет мне добавлять вывод от себя (используя -a), если файл существует, что и происходит в этом случае.