Проверьте наличие нулевой переменной в пакете Windows - PullRequest
66 голосов
/ 08 апреля 2009

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

Ответы [ 4 ]

121 голосов
/ 08 апреля 2009

Чтобы проверить наличие параметра командной строки, используйте пустые скобки:

IF [%1]==[] echo Value Missing

или

IF [%1] EQU [] echo Value Missing

Страница SS64 на IF поможет вам здесь. В разделе «Существует ли% 1?».

Вы не можете установить позиционный параметр, поэтому вы должны сделать что-то вроде

SET MYVAR=%1

Затем вы можете переустановить MYVAR на основе его содержимого.

28 голосов
/ 08 апреля 2009

Оба ответа верны, но я делаю свои немного по-другому. Возможно, вы захотите рассмотреть пару вещей ...

Запустить пакет с:

SetLocal

и завершите его

EndLocal

Это сохранит все ваши «SET» действительными только во время текущего сеанса и не оставит переменные, оставленные вокруг, с именем, например «FileName1», или любые другие переменные, которые вы установили во время выполнения, которые могут помешать следующему запуску пакетный файл. Итак, вы можете сделать что-то вроде:

IF "%1"=="" SET FileName1=c:\file1.txt

Другой трюк в том случае, если вы предоставляете только 1 или 2 параметра, используйте команду SHIFT для их перемещения, поэтому вы ищете ВСЕГДА на% 1 ...

Например, обработайте первый параметр, сдвиньте их, а затем сделайте это снова. Таким образом, вы не будете жестко кодировать% 1,% 2,% 3 и т. Д. *

Пакетный процессор Windows намного мощнее, чем считают люди. Я сделал с ним некоторые сумасшедшие вещи, в том числе вычисление вчерашней даты, даже по месяцам и годам, включая високосный год, и локализация и др.

Если вы действительно хотите проявить творческий подход, вы можете вызывать функции в пакетном процессоре ... Но это действительно для другого обсуждения ...:)

Да, и не называйте ваши командные файлы .bat . Либо .. Они .cmd сейчас .. хе ..

Надеюсь, это поможет.

27 голосов
/ 22 декабря 2011

Правильнее было бы использовать выражение «если определено», которое используется для проверки существования переменной. Например:

IF DEFINED somevariable echo Value exists

В данном конкретном случае следует использовать отрицательную форму:

IF NOT DEFINED somevariable echo Value missing

PS: имя переменной следует использовать без символов "%".

13 голосов
/ 08 апреля 2009
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%

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...