Проверьте наличие нулевой переменной в пакете Windows
Я работаю над пакетным файлом Windows, который будет bcp три текстовых файла в 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 и/или являются нулевыми. Я также не знаю, как установить эти значения условно. Это возможно? Любые предложения будут оценены.
4 ответа:
чтобы проверить наличие параметра командной строки, используйте пустые скобки:
IF [%1]==[] echo Value Missing
или
IF [%1] EQU [] echo Value Missing
The SS64 страница на IF поможет вам здесь. В разделе " существует ли %1?".
вы не можете установить позиционный параметр, так что вы должны сделать что-то вроде
SET MYVAR=%1
затем вы можете повторно установить MYVAR на основе его содержимого.
оба ответа верны, но я немного по-другому. Возможно, вы захотите рассмотреть пару вещей...
запустите пакет с помощью:
SetLocal
и
EndLocal
это сохранит все ваши" наборы", чтобы быть действительными только во время текущего сеанса, и не оставит vars вокруг имени, как" FileName1 " или любые другие переменные, которые вы установили во время выполнения, что может помешать следующему запуску пакетного файла. Итак, вы можете что-то сделать например:
IF "%1"=="" SET FileName1=c:\file1.txt
другой трюк заключается в том, что если вы предоставляете только 1 или 2 параметра, используйте команду SHIFT для их перемещения, поэтому тот, который вы ищете, всегда находится в %1...
например, обработайте первый параметр, сдвиньте их, а затем сделайте это снова. Таким образом, вы не жестко кодируете %1, %2, %3 и т. д...
пакетный процессор Windows много более мощный, чем люди дают ему кредит.. Я сделал некоторые сумасшедшие вещи с ним, в том числе вычисление вчерашней даты, даже через границы месяца и года, включая високосный год, и локализацию и т. д.
Если вы действительно хотите получить творческий подход, вы можете вызвать функции в пакетном процессоре... Но это действительно для другой дискуссии... :)
О, и не называйте свои пакетные файлы .летучая мышь либо.. Они .cmd's теперь.. хех..
надеюсь, что это помогает.
правильно было бы использовать оператор "if defined", который используется для проверки существования переменной. Например:
IF DEFINED somevariable echo Value exists
в данном конкретном случае следует использовать отрицательную форму:
IF NOT DEFINED somevariable echo Value missing
PS: имя переменной должно использоваться без символов"%".
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%
будьте осторожны с символами кавычек, хотя они могут понадобиться или не понадобиться в ваших переменных.