Проверка нулевой переменной в пакете Windows
Я работаю над пакетным файлом Windows, который будет загружать три текстовых файла в SQL Server. Если что-то пойдет не так в производстве, я хочу, чтобы иметь возможность переопределять имена файлов. Поэтому я думаю о том, чтобы сделать что-то вроде этого.
bcp.exe MyDB..MyTable1 in %1 -SMyServer -T -c -m0
bcp.exe MyDB..MyTable2 in %2 -SMyServer -T -c -m0
bcp.exe MyDB..MyTable3 in %3 -SMyServer -T -c -m0
Я хотел бы иметь возможность вводить имена по умолчанию для всех трех файлов, которые будут использоваться, если позиционные параметры не будут предоставлены. Идея заключалась бы в том, чтобы выполнить
myjob.bat
без параметров и использовать его по умолчанию или выполнить
myjob.bat "c:\myfile1" "c:\myfile2" "c:\myfile3"
и использовать эти файлы. Я не смог выяснить, как определить, существуют ли% 1,% 2 и% 3 и/или являются нулевыми. Я также не знаю, как установить эти значения условно. Это возможно? Любые предложения будут оценены.
Ответы
Ответ 1
Чтобы проверить наличие параметра командной строки командной строки, используйте пустые скобки:
IF [%1]==[] echo Value Missing
или
IF [%1] EQU [] echo Value Missing
Страница SS64 на IF поможет вам здесь. В разделе "Существует ли% 1?".
Вы не можете установить позиционный параметр, так что вы должны сделать что-то вроде
SET MYVAR=%1
Затем вы можете повторно установить MYVAR на основе его содержимого.
Ответ 2
Оба приведенных ответа верны, но я немного отличаюсь. Возможно, вы захотите рассмотреть пару вещей...
Запустите пакет с помощью:
SetLocal
и завершите его с помощью
EndLocal
Это приведет к тому, что все ваши "SET" будут действительны только во время текущего сеанса и не оставят оставленные вары вокруг имени "FileName1" или любые другие переменные, которые вы задали во время прогона, что может помешать следующему прогону командный файл. Итак, вы можете сделать что-то вроде:
IF "%1"=="" SET FileName1=c:\file1.txt
Другой трюк заключается в том, что если вы предоставляете только 1 или 2 параметра, используйте команду SHIFT для их перемещения, поэтому тот, который вы ищете, ВСЕГДА на% 1...
Например, обработайте первый параметр, сдвиньте их, а затем сделайте снова. Таким образом, вы не жестко кодируете% 1,% 2,% 3 и т.д.
Процессор пакетной обработки Windows намного эффективнее, чем люди дают ему кредит.. Я сделал некоторые сумасшедшие вещи с ним, включая расчет вчерашнего дня, даже в течение месяца и года, включая Leap Year, и локализацию и т.д.
Если вы действительно хотите стать творческим, вы можете вызывать функции в пакетном процессоре... Но это действительно для другого обсуждения...:)
Ох, и не называйте свои командные файлы .bat.. Они теперь .cmd.. хе..
Надеюсь, что это поможет.
Ответ 3
Правильная вещь - использовать оператор if if, который используется для проверки существования переменной. Например:
IF DEFINED somevariable echo Value exists
В этом конкретном случае следует использовать отрицательную форму:
IF NOT DEFINED somevariable echo Value missing
PS: имя переменной должно использоваться без символов "%".
Ответ 4
rem set defaults:
set filename1="c:\file1.txt"
set filename2="c:\file2.txt"
set filename3="c:\file3.txt"
rem set parameters:
IF NOT "a%1"=="a" (set filename1="%1")
IF NOT "a%2"=="a" (set filename2="%2")
IF NOT "a%3"=="a" (set filename1="%3")
echo %filename1%, %filename2%, %filename3%
Будьте осторожны с символами кавычек, хотя они могут или не нуждаться в них в ваших переменных.