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

Ключевые вопросы в моем цикле

  1. Используйте переменную %%f только один раз за цикл и присвойте ее indir . С этого момента используйте !indir! переменная.
  2. Я удалил использование %tempoutfile% потому что команда fromxsf позволяет мне добавлять вывод от себя (используя -a), если файл существует, что и происходит в этом случае.

0