在Windows批处理中检查空variables

我正在处理一个Windowsbatch file,将三个文本文件插入到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 

我希望能够input所有三个文件的默认名称,如果没有提供位置参数将被使用。 这个想法是要么执行

 myjob.bat 

没有参数,并使用默认值,或执行

 myjob.bat "c:\myfile1" "c:\myfile2" "c:\myfile3" 

并让它使用这些文件。 我还没有弄清楚如何判断%1,%2和%3是否存在和/或为空。 我也不知道如何有条件地设置这些值。 这可能吗? 任何build议,将不胜感激。

要testing是否存在命令行参数,请使用空括号:

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

要么

 IF [%1] EQU [] echo Value Missing 

IF上的SS64页面将帮助你。 在“是否存在%1?”下。

你不能设置一个位置参数,所以你应该做的是做类似的事情

 SET MYVAR=%1 

然后您可以根据其内容重新设置MYVAR。

给出的两个答案都是正确的,但是我有点不同。 你可能想考虑一些事情…

开始批处理:

 SetLocal 

并以此结束

 EndLocal 

这将使所有的“SET”在当前会话期间保持有效,并且不会留下名为“FileName1”的variables或在运行期间设置的任何其他variables,这些variables可能会干扰batch file的下一次运行所以你可以这样做:

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

另一个技巧是,如果你只提供1个或2个参数,使用SHIFT命令来移动它们,所以你正在寻找的是始终在%1 …

例如,处理第一个参数,转换它们,然后重新执行。 这样,你不是硬编码%1,%2,%3等…

Windows批量处理器比人们对它的功劳强大得多。我已经做了一些疯狂的事情,包括计算昨天的date,即使在跨越月份和年份的边界,包括闰年和本地化等。

如果你真的想要创造性,你可以调用批处理函数中的函数…但这是真正的不同的讨论… 🙂

哦,也不要把你的batch file命名为.bat ..他们现在是.cmd ..呃..

希望这可以帮助。

正确的做法是使用“if defined”语句,用来testingvariables是否存在。 例如:

 IF DEFINED somevariable echo Value exists 

在这个特殊情况下,应使用否定forms:

 IF NOT DEFINED somevariable echo Value missing 

PS:variables名称应该没有“%”字符。

 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% 

尽pipe引用字符要小心,你可能会也可能不需要它们在你的variables中。