If和copy组合失败,语法不正确

时间:2018-08-09 11:58:28

标签: windows batch-file windows-console

我正在尝试创建一个.bat文件,该文件使用Parameter定义应执行的副本。

我尝试了if无副本(代替回显),它可以正常工作,并且尝试了copy命令,也可以正常工作,但是每当我尝试在.bat文件中合并两者时,我得到: 该命令的语法不正确。

@echo off

if "%1%"=="P1" (copy /y c:\Meldung\Mel_properties_p1.bak c:\Meldung\gsa.properties)
if "%1%"=="P2" (copy /y c:\Meldung\Mel_properties_p2.bak c:\Meldung\Mel.properties)

@echo on

即使在看了技术文档之后,我也没有发现任何对我来说不对的地方。因此,我的问题是:这是怎么了?又为什么呢?

1 个答案:

答案 0 :(得分:1)

您的参数是%1,而不是%1%,它是环境变量的语法(该变量不存在,因为它转换为%1和单个% ),因此解析器会尝试根据其规则进行翻译:

if <Parameter1><variable>

,它尝试评估直到冒号为止的名为"=="P1" (copy /y c的变量(无论如何都是无效的变量名),它具有特殊含义(请参见子字符串替换set /?)。这注定会失败。

使用echo on,您将获得该行,因为解析器试图执行该行:

if "P1\Meldung\Mel_properties_p1.bak c:\Meldung\gsa.properties)

显然if语法不正确。

解决方案:只需对参数使用正确的语法即可,并且有效:

if "%1"=="P1" (copy /y c:\Meldung\Mel_properties_p1.bak c:\Meldung\gsa.properties)
if "%1"=="P2" (copy /y c:\Meldung\Mel_properties_p2.bak c:\Meldung\Mel.properties)

注意:我建议使用if /i "%~1" ...,其中/i使其不区分大小写(也将识别p1),并且%~1删除参数周围的引号(如果存在)。 (否则,您可能会以if ""P1"" ...结尾,这很麻烦)