分配给在批处理脚本中不起作用的变量的值

时间:2015-01-25 05:08:39

标签: batch-file

这是我想写的逻辑。它需要在Windows 7,Windows 2008服务器和Windows 2012服务器上运行。 我想测试一个文件(x.txt)的存在,如果它不存在,我想创建它。 如果文件x.txt存在,我想创建一个临时文件并进行比较。如果它们都相等,则为del temp文件。否则,覆盖x.txt。

问题是抱怨")此时出乎意料。"当执行第一个IF NOT EXIST语句时。 现在,如果我使用"%destFile%",它总是说"系统找不到指定的路径。"并运行writeOutputConf 即使文件存在。

FC命令再次无效!

我做错了什么?帮助。

SET destFile="C:\Test Scripts\local\x.txt"
SET tmpFile="C:\Test Scripts\local\tmp.txt"
IF NOT EXIST %destFile% (
    call:writeOutputConf
) ELSE (
    call:writeTempConf  
    FC %destFile% %tmpFile%>NUL
    IF ERRORLEVEL 1 (
        ECHO files are not equal
        CALL:writeOutputConf
        DEL "%tmpFile%"
    ) ELSE (
    ECHO files are equal
    DEL "%tmpFile%"
    )   
)
:: Functions
:writeOutputConf
ECHO Hellow World>%destFile%
GOTO:EOF

:writeTempConf
ECHO Hellow World>%tmpFile%
GOTO:EOF

1 个答案:

答案 0 :(得分:2)

两个明显的问题。

你很困惑:

SET destFile="C:\Test Scripts\local\x.txt"

SET "destFile=C:\Test Scripts\local\x.txt"

第一个将destfile设置为带引号的字符串+该行上可能存在的任何尾随空格。

第二个确保不包括任何尾随空格并指定一个不带引号的字符串。

就个人而言,我发现第二个更灵活。

在您的代码中,您要分配带引号的字符串,所以

FC %destFile% %tmpFile%>NUL

将正确比较这两个文件。每个必须是带引号的字符串,因为路径包含空格。

我会把它写成

FC "%destFile%" "%tmpFile%">NUL

使用不带引号的字符串。

到目前为止,只是一个惯例,然而你继续使用

    DEL "%tmpFile%"

,因为您使用引用的字符串被评估为

    DEL ""thetempfilename""

所以引号不是必需的......

道德:选择一个惯例并坚持下去。

第二个问题是批次没有"程序结束的概念"物理文件结束之外的其他内容。因此,

    )   
)
:: Functions
:writeOutputConf
ECHO Hellow World>%destFile%

通过标签:writeOutputConf快速收费并创建文件,无论if语句何时完成。

  • 在最后一个闭括号后添加GOTO :EOF以停止子程序的落实。
相关问题