检查Windows批处理中的空变量

时间:2009-04-08 18:48:34

标签: windows batch-file

我正在开发一个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是否存在和/或是否为空。我也不知道如何有条件地设置这些值。这可能吗?任何建议将不胜感激。

5 个答案:

答案 0 :(得分:121)

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

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

IF [%1] EQU [] echo Value Missing

SS64 page on IF会帮助你。在“%1是否存在?”下。

您无法设置位置参数,因此您应该执行类似

的操作
SET MYVAR=%1

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

答案 1 :(得分:28)

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

使用以下命令启动批处理:

SetLocal

并以

结束
EndLocal

这将使您的所有“SET”仅在当前会话期间保持有效,并且不会留下名为“FileName1”的变量或在运行期间设置的任何其他变量,这可能会干扰下一次运行批处理文件。所以,你可以这样做:

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

另一个技巧是如果你只提供1个或2个参数,使用SHIFT命令移动它们,所以你要找的那个总是在%1 ...

例如,处理第一个参数,移动它们,然后再次执行。这样,你就不会硬编码%1,%2,%3等......

Windows批处理器很多比人们给它的功能更强大。我已经做了一些疯狂的事情,包括计算昨天的日期,甚至包括闰年的月份和年份边界和本地化等。

如果你真的想要发挥创意,你可以在批处理器中调用函数......但这真的是为了不同的讨论......:)

哦,并且不要将您的批处理文件命名为 .bat ..它们现在是 .cmd 了......嘿..

希望这有帮助。

答案 2 :(得分:27)

正确的做法是使用"如果已定义"语句,用于测试变量的存在。例如:

IF DEFINED somevariable echo Value exists

在这种特殊情况下,应使用否定形式:

IF NOT DEFINED somevariable echo Value missing

PS:变量名称不应使用"%" caracters

答案 3 :(得分:13)

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%

但请注意引号字符,您可能需要或不需要它们。

答案 4 :(得分:1)

最新答案,但目前公认的答案至少是次优的。

使用引号总是比使用任何其他字符括起%1更好。
因为当%1包含空格或特殊字符(例如&)时,IF [%1] ==会因语法错误而停止。

但是对于%1包含引号的情况,例如myBatch.bat "my file.txt",简单的IF "%1" == ""将会失败。

但是您可能不知道是否使用了引号,所以使用了语法%~1,这在必要时会删除引号。

因此,代码应类似于

set "file1=%~1"
IF "%~1"=="" set "file1=default file"

type "%file1%"   --- always enclose your variables in quotes

如果您必须处理诸如myBatch.bat "This & will "^&crash之类的陌生和更原始的参数,
然后看看SO:How to receive even the strangest command line parameters?