我正在处理一个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条答案
按热度按时间k4emjkb11#
要测试命令行参数是否存在,请使用空括号:
字符串
或者是
型
SS64 page on IF将在“测试变量是否为空”下帮助您。
您不能设置位置参数,因此应该执行以下操作
型
然后,您可以根据其内容重新设置MYVAR。
dffbzjpn2#
正确的做法是使用“if defined”语句,该语句用于测试变量是否存在。举例来说:
字符串
在这种特殊情况下,应使用否定形式:
型
PS:变量名不带%字符。
izj3ouym3#
两个答案都是正确的,但我的答案有点不同。你可能要考虑几件事...
开始批处理:
字符串
最后以
型
这将使您的所有“SET”仅在当前会话期间有效,并且不会留下名为“FileName1”的变量或您在运行期间设置的任何其他变量,这些变量可能会干扰批处理文件的下一次运行。所以,你可以这样做:
型
另一个技巧是,如果您只提供1或2个参数,请使用SHIFT命令移动它们,这样您要查找的参数始终位于%1...
例如,处理第一个参数,移动它们,然后再做一次。这样,您就不会硬编码%1、%2、%3等...
Windows批处理器比人们给予的要强大得多。我用它做了一些疯狂的事情,包括计算昨天的日期,甚至跨越月份和年份的界限,包括闰年,以及本地化等。
如果你真的想发挥创造力,你可以在批处理器中调用函数…但那是另一个主题了...:)
哦,也不要将批处理文件命名为**.bat**。他们现在是**.cmd**的。嘿..
希望这对你有帮助。
ca1c2owp4#
字符串
但是要小心引号字符,在变量中可能需要也可能不需要。
roqulrg35#
迟来的答案,但目前接受的一个是至少次优。
使用引号总是比使用任何其他字符括起
%1
更好。因为当
%1
包含空格或特殊字符(如&
)时,IF [%1] ==
会因语法错误而停止。但是对于
%1
包含引号的情况,如myBatch.bat "my file.txt"
,简单的IF "%1" == ""
将失败。但是你不知道是否使用了引号,有一个语法
%~1
,它在必要时删除了引号。因此,代码应该如下所示
字符串
如果您必须处理像
myBatch.bat "This & will "^&crash
这样更奇怪、更讨厌的参数再看看SO:How to receive even the strangest command line parameters?