#loops #batch-file
#циклы #пакетный файл
Вопрос:
Как мне выполнить несколько пакетных команд для нескольких файлов один за другим. Значение, скажем, если я хочу сначала переместить файл из одной папки в рабочую папку, переименовать файл в формат csv, вызвать скрипт sqlloader, вызвать второй sql-скрипт и, наконец, вызвать другой sql-скрипт — все шаги, описанные выше, должны выполняться не для всех файлов, а для одного файлавремя. Я попробовал что-то вроде этого, как показано ниже, но получение ошибки как » Downloads Validation Prestage * .psa) было неожиданным в это время». Не могу ли я передать подстановочный знак *.psa в критерии цикла?
Большое спасибо и ценю ваше время на это.
echo off
:MAIN
copy C:DownloadsPrevalidation*.psa C:DownloadsValidationPrestage
FOR %A IN (C:DownloadsValidationPrestage*.psa) DO ( move C:DownloadsValidationPrestage*.psa C:DownloadsValidationWIP
ren C:DownloadsValidationWIP*.psa *.csv
<call sqlloader now>
<call update script now>
<call validation script now>
)
exit
Спасибо,
Сандерс.
Ответ №1:
Ваша стратегия верна.
Существует одна незначительная синтаксическая ошибка: вам нужно использовать %%A
вместо %A
FOR
команды внутри файла BAT. И затем вам нужно ссылаться на %%A
внутри цикла как на имя обрабатываемого файла.
@echo off
copy C:DownloadsPrevalidation*.psa C:DownloadsValidationPrestage
FOR %%A IN (C:DownloadsValidationPrestage*.psa) DO (
move %%A C:DownloadsValidationWIP%%~nA.psa
ren C:DownloadsValidationWIP%%~nA.psa *.csv
<call sqlloader now>
<call update script now>
<call validation script now>
)
Комментарии:
1. PA — спасибо за ваш ответ. Тем не менее, я все еще получаю синтаксическую ошибку при выполнении скрипта. Вот мой сценарий — echo off: ОСНОВНАЯ копия C:DownloadsPrevalidation *.psa C:DownloadsValidationPrestage ДЛЯ %%A В (C:DownloadsValidationPrestage *.psa) СДЕЛАТЬ (переместить %%A C:DownloadsValidationWIP %%~nA.psa рен C:DownloadsValidationWIP %%~Вызов nA.psa psaload.csv C:CAP_SPSBatchscriptsrunloader.bat позвоните C:CAP_SPSBatchscriptsrunupdate.bat позвоните C:CAP_SPSBatchscriptsrunvalidation . bat del C:DownloadsValidationWIPpsaload.csv ) выход
2. @user982201: я бы рекомендовал использовать кавычки вокруг имен в
move
иren
командах, напримерmove "%%A" "C:DownloadsValidationWIP%%~nA.psa"
.3. @user98822 какая команда не выполняется ?… префикс всех ваших команд с помощью echo и добавьте кавычки вокруг имен файлов.
4. PA — сбой при переименовании файла. Сообщение об ошибке: «Синтаксис команды неверен». И я думаю, что знаю причину этого. Приведенный выше цикл работает не так, как хотелось бы. Он перемещает все файлы * .psa из предварительной папки в папку WIP, а затем программа не понимает, в какой файл переименовать, поскольку я передаю одно имя целевого файла для запуска моего сценария загрузки и других сценариев, следующих за ним. Итак, вернемся к моему первому вопросу — как мне выполнить серию команд для каждого файла, присутствующего в папке, а не для всех сразу?