与空白比较时,批处理IF语句给出语法错误

时间:2018-08-01 06:40:46

标签: batch-file

我需要编写代码,以替换%test%变量的时间字符串的空白,并以foo01_08_2018-06_07_47.war格式输出。

下面的代码(如果与IF语句隔离)返回正确的字符串,但是,此代码在某处返回语法错误。我正在使用Windows 10,该批处理文件应该可以在Windows Server 2016操作系统上运行。

@echo off
SET test=" 6:07:47,43"
IF "%test%"=="%test: =%" (
    echo foo%date:~0,2%_%date:~3,2%_%date:~6,6%-0%time:~1,1%_%time:~3,2%_%time:~6,2%.war
) ELSE (
    echo foo%date:~0,2%_%date:~3,2%_%date:~6,6%-%time:~0,2%_%time:~3,2%_%time:~6,2%.war
)
pause

关于此IF语句出了什么问题的任何想法?我尝试了stackoverflow提供的无数解决方案,它们似乎都已过时或在我的情况下不起作用。

3 个答案:

答案 0 :(得分:4)

您的if语句正在比较"" 6:07:47,43""""6:07:47,43""。语法错误是由于双"引起的,一次来自IF "%test%"=="%test: =%",一次来自变量值" 6:07:47,43"

只需将它们从set语句或if语句中删除。 if语句本身不需要引号,因此if %test%==%test: =%就可以了。如果%test%为空,则if语句将出现另一个语法错误(不进行任何比较),因此建议设置不带引号的变量。

SET test= 6:07:47,43

一个未公开的功能是您可以在"中设置set语句。这将产生相同的变量值,但会保存为&和值中的其他特殊字符。

SET "test= 6:07:47,43"

答案 1 :(得分:2)

带引号的SET的正确语法是:mapStateToProps而不是SET "foo=bar"

将第二行更改为

SET foo="bar"

似乎可以解决问题

答案 2 :(得分:1)

您应该考虑使用一种方法来以一致的格式获取日期和时间。在批处理文件中,您可以使用WMIC和Powershell进行此操作。

使用WMIC,输出将始终采用以下格式:YYYYYMMDDhhmmss

for /f "tokens=2 delims==." %%G in ('wmic OS Get localdatetime /value') do set "dt=%%G"

在Powershell中,您可以控制输出格式。您可以重新排列任何日期和时间值,并使用所需的任何分隔符。

FOR /F "usebackq delims=" %%G IN (`powershell "(Get-Date).ToString('yyyy-MM-dd-hh-mm-ss')"`) DO set dt=%%G