Проверьте наличие нулевой переменной в пакете 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 65

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%

будьте осторожны с символами кавычек, хотя они могут понадобиться или не понадобиться в ваших переменных.