这是我想写的逻辑。它需要在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
答案 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
以停止子程序的落实。