Подтвердить что ты не робот

Проверка нулевой переменной в пакете 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 и/или являются нулевыми. Я также не знаю, как установить эти значения условно. Это возможно? Любые предложения будут оценены.

4b9b3361

Ответ 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%

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