检查Windows批处理中的空变量

Joh*_*ant 66 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
Run Code Online (Sandbox Code Playgroud)

我希望能够为所有三个文件输入默认名称,如果未提供位置参数,则使用该名称.这个想法要么是要执行

myjob.bat
Run Code Online (Sandbox Code Playgroud)

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

myjob.bat "c:\myfile1" "c:\myfile2" "c:\myfile3"
Run Code Online (Sandbox Code Playgroud)

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

crb*_*crb 122

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

IF [%1]==[] echo Value Missing
Run Code Online (Sandbox Code Playgroud)

要么

IF [%1] EQU [] echo Value Missing
Run Code Online (Sandbox Code Playgroud)

IF上SS64页面将在这里为您提供帮助.在"%1存在吗?"下.

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

SET MYVAR=%1
Run Code Online (Sandbox Code Playgroud)

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


Lar*_*ryF 28

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

启动批处理:

SetLocal
Run Code Online (Sandbox Code Playgroud)

结束它

EndLocal
Run Code Online (Sandbox Code Playgroud)

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

IF "%1"=="" SET FileName1=c:\file1.txt
Run Code Online (Sandbox Code Playgroud)

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

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

在Windows批量处理器是很多更强大的比人们给它的信贷..我已经做了一些疯狂的事情吧,包括计算昨天的日期,甚至是跨月份和年份的界限,包括闰年和本地化等.

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

哦,不要把你的批处理文件命名为.bat ..它们现在是.cmd .. 呵呵..

希望这可以帮助.

  • 实际上,我认为这是一次抛弃.BAT用于DOS,而CMD用于WinNT ..但是,真正的原因是,曾经有过cmd.exe和command.com..cmd与cmd.exe有关,它是那些解析器.我认为这也让你看起来更酷,但我无法证实.:) (5认同)

小智 28

正确的做法是使用"if defined"语句,用于测试变量的存在.例如:

IF DEFINED somevariable echo Value exists
Run Code Online (Sandbox Code Playgroud)

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

IF NOT DEFINED somevariable echo Value missing
Run Code Online (Sandbox Code Playgroud)

PS:变量名称应该在没有"%"字符的情况下使用.


Sta*_*zev 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%
Run Code Online (Sandbox Code Playgroud)

但请注意引号字符,您可能在变量中需要或不需要它们.

  • +1; 几乎任何字符或字符串都可以:如果不是%1.==.; 如果不是{%1} == {}; 如果不是%1null == null ... (2认同)