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