无法将Batch变量设置为命令输出

时间:2018-12-13 12:01:37

标签: powershell batch-file cmd

我在.BAT文件中尝试获取UTC字符串的行如下。

FOR /F "tokens=*" %g IN ('powershell -command "Get-Date -date (Get-Date).ToUniversalTime()-uformat %Y-%m-%dT%H_%M_%SZ"') do (SET VAR=%g)

其中使用了在命令提示符下工作的PowerShell行。

powershell -command "Get-Date -date (Get-Date).ToUniversalTime()-uformat %Y-%m-%dT%H_%M_%SZ"

我得到了错误。

Y-dTM_g) was unexpected at this time.

这是更广泛的批处理文件的一部分,所以我不能直接在PowerShell脚本中直接执行它。

我从这里得到了最初的灵感。

How to set commands output as a variable in a batch file

更新

尝试此代码无济于事。

test.bat

FOR /F "tokens=*" %%g IN ('powershell -command "Get-Date -date (Get-Date).ToUniversalTime()-uformat %Y-%m-%dT%H_%M_%SZ"') do (
    SET "VAR=%%g"
)

echo %VAR%

获取输出。

D:\foo>FOR /F "tokens=*" %g IN ('powershell -command "Get-Date -date (Get-Date).ToUniversalTime()-uformat m-H_SZ"') do (SET "VAR=%g" )

D:\foo>(SET "VAR=m-H_SZ" )

D:\foo>echo m-H_SZ
m-H_SZ

D:\foo>

1 个答案:

答案 0 :(得分:3)

在批处理中使用代码会消耗第一个%,因此您需要对其加倍。只需尝试一下:

FOR /F "tokens=*" %%g IN ('powershell -command "Get-Date -date (Get-Date).ToUniversalTime()-uformat %%Y-%%m-%%dT%%H_%%M_%%SZ"') do SET "VAR=%%g"

始终将设置的变量括在双引号中以消除任何可能的空格也是很好的选择。

原始代码仅在从cmd终端运行时才有效。

如果您在循环中设置变量,则需要delayedexpansion

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=*" %%g IN ('powershell -command "Get-Date -date (Get-Date).ToUniversalTime()-uformat %%Y-%%m-%%dT%%H_%%M_%%SZ"') do (
    SET "VAR=%%g"
)
echo !VAR!

有关延迟扩展的更多信息,请参见cmd.exe

set /?
setlocal /?