Пакетный файл для объединения имен файлов в строку не работает - PullRequest
1 голос
/ 20 ноября 2011

Я хочу создать командный файл, который сделает меня счастливым длинной строкой всех имен файлов в каталоге.

Итак, у меня есть каталог:

-docA.pdf
-docB.pdf
-docC.pdf

И я хочу получить такую ​​строку:

docA.pdf docB.pdf docC.pdf

В двух словах: http://bit.ly/u1eAHO

Долгий путь: я написал скрипт

    @echo off 
pushd "%~dp0"
set "FILE_LIST=pre_"

FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
        IF NOT %%i==%~nx0 (                                                     
                echo %%i

                set "FILE_LIST=%FILE_LIST%%%i"
                echo %FILE_LIST%                                                
        )
    )

echo %FILE_LIST%
pause

И получил такой вывод:

docA.pdf
pre_

docB.pdf
pre_

docC.pdf
pre_

pre_docC.pdf

Почему?Как я могу получить хороший?

1 Ответ

2 голосов
/ 20 ноября 2011

Это довольно известная проблема с пакетными файлами. Короткий ответ - командные файлы выполняются путем расширения переменных в строке перед их выполнением. Для многострочных блоков (в скобках) все переменные, не являющиеся циклами, раскрываются один раз, а затем цикл запускается. Ваше тело цикла по существу:

IF NOT %%i==%~nx0 (
    echo %%i
    set "FILE_LIST=pre_%%i"
    echo pre_
)

Они добавили функцию под названием отложенное расширение где-то по пути (NT4 IIRC), которую можно включить в реестре или с помощью оператора SETLOCAL. Измените ваш скрипт на что-то вроде:

@echo off 
setlocal EnableDelayedExpansion EnableExtensions
pushd "%~dp0"
FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
    IF NOT %%i==%~nx0 (                                                     
        set "FILE_LIST=!FILE_LIST!%%i"
    )
)
echo %FILE_LIST%
endlocal
pause

и это должно работать. Я ухожу из окна Windows до понедельника, но это должно быть достаточно близко. Если вы столкнетесь с какими-либо проблемами, прочитайте справку, указав FOR /? и SETLOCAL /? в командной строке.

...