Как сделать так, чтобы цикл в пакетном файле Windows запускался в порядке имен - PullRequest
7 голосов
/ 31 августа 2010

У меня есть пакетный файл Windows, который делает это:

for %%s in (*.sql) do call

It loops through all the sql script in a folder.

In the folder the file names are like:
s4.06.01.sql
s4.07.01.sql
s4.08.01.sql
s4.10.01.sql
s5.01.sql

Но цикл for проходит файлы случайным образом (не в порядке имен), сначала запускается s5.01, затем s4.06, затем s4.08, затем s4.10, затем s4.07. Как я могу заставить их работать в порядке имен?

Раньше работал, но сейчас нет. Что может вызвать эту проблему?

Ответы [ 3 ]

6 голосов
/ 31 августа 2010

Ответ Джерри вполне может быть тем, что является причиной проблемы.

Вы можете решить эту проблему, изменив

for %%s in (*.sql) do call

до

for %%s in (dir"*.sql ^| sort) do call


Редактировать Cudo's в LonelyPixel

Опубликованное решение не работает как на компьютере с Windows 8 (возможно, тогда оно работало с Windows XP, но я понятия не имею) .

Ниже приведено рабочее решение с использованием командной строки Windows 8.

for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo %%s
2 голосов
/ 31 августа 2010

Если память служит, она будет работать с файлами в порядке, который они возвращают файловой системой.Таким образом, если вы запустите его на дисковом разделе, отформатированном в NTFS, имена будут возвращены в отсортированном порядке, поэтому они будут обработаны в отсортированном порядке.Если раздел диска отформатирован с использованием чего-то вроде FAT или FAT32, имена будут извлечены (и обработаны) в более или менее случайном порядке.

1 голос
/ 20 октября 2015

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

for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo "%%s"

В моем случае это был SQLCMD, со скриптами в подкаталоге, например так:

SET "machineName=localhost"
for /f "tokens=*" %%f in ('dir /b PostDeployScripts\*.sql ^| sort') do sqlcmd -E -S%machineName% -i"PostDeployScripts\%%f"
...