检查Windows批处理中的空变量

13z8s7eq  于 2023-08-07  发布在  Windows
关注(0)|答案(5)|浏览(144)

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

k4emjkb1

k4emjkb11#

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

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

字符串
或者是

IF [%1] EQU [] echo Value Missing


SS64 page on IF将在“测试变量是否为空”下帮助您。
您不能设置位置参数,因此应该执行以下操作

SET MYVAR=%1


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

dffbzjpn

dffbzjpn2#

正确的做法是使用“if defined”语句,该语句用于测试变量是否存在。举例来说:

IF DEFINED somevariable echo Value exists

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

IF NOT DEFINED somevariable echo Value missing

PS:变量名不带%字符。

izj3ouym

izj3ouym3#

两个答案都是正确的,但我的答案有点不同。你可能要考虑几件事...
开始批处理:

SetLocal

字符串
最后以

EndLocal


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

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


另一个技巧是,如果您只提供1或2个参数,请使用SHIFT命令移动它们,这样您要查找的参数始终位于%1...
例如,处理第一个参数,移动它们,然后再做一次。这样,您就不会硬编码%1、%2、%3等...
Windows批处理器比人们给予的要强大得多。我用它做了一些疯狂的事情,包括计算昨天的日期,甚至跨越月份和年份的界限,包括闰年,以及本地化等。
如果你真的想发挥创造力,你可以在批处理器中调用函数…但那是另一个主题了...:)
哦,也不要将批处理文件命名为**.bat**。他们现在是**.cmd**的。嘿..
希望这对你有帮助。

ca1c2owp

ca1c2owp4#

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%

字符串
但是要小心引号字符,在变量中可能需要也可能不需要。

roqulrg3

roqulrg35#

迟来的答案,但目前接受的一个是至少次优。
使用引号总是比使用任何其他字符括起%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?

相关问题