0

%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 提供的无数解决方案,所有这些解决方案似乎都已过时,或者在我的情况下不起作用。

4

3 回答 3

4

您的 if 语句正在比较"" 6:07:47,43""and ""6:07:47,43""。语法错误是由于 double ", once 来自 theIF "%test%"=="%test: =%"和 once 来自变量 value " 6:07:47,43"

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

SET test= 6:07:47,43

一个未记录的功能是您可以在". 这将产生相同的变量值,但会保存值中的&其他特殊字符。

SET "test= 6:07:47,43"
于 2018-08-01T08:22:27.410 回答
2

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

将第二行更改为

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

似乎可以解决问题

于 2018-08-01T06:59:20.567 回答
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
于 2018-08-01T12:28:03.610 回答