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

标签 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>

最佳答案

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

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 /?

关于powershell - 无法将Batch变量设置为命令输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53761418/

相关文章:

powershell - 变量赋值中括号前的逗号

json - 使用 PowerShell 如何在具有注释的 json 文件中替换和保存值

string - 批量扩展变量不能在子字符串替换函数中使用

c# - 将 Batch shell 脚本输出读入 C# .Net 程序

function - 函数中的空参数不为 Null

powershell - 从终端进行Visual Studio Code PowerShell代码调试

windows - 如何使用批处理按字符串过滤txt文件

batch-file - 使用批处理文件跨驱动器移动目录

c# - 在文件 C# 上执行操作系统命令

IOS 应用程序运行时命令行失败