将 PowerShell 命令结果分配给批处理脚本中的变量

Assign PowerShell command result to variable within Batch-Script

我想在批处理脚本中实现我在 PowerShell CLI 中可以做的事情:

PS C:\Users\andreas.luckert> $timestamp = Get-Date -UFormat "%d-%m-%Y--%R-UTC%Z" | ForEach-Object { $_ -replace ":", "." }

PS C:\Users\andreas.luckert> echo $timestamp
26-11-2021--15.55-UTC+01

现在,在我的批处理脚本中,我尝试了类似于以下的方法

SET _timestamp=('Get-Date -UFormat "%d-%m-%Y--%R-UTC%Z" | ForEach-Object { $_ -replace ":", "." }')

然而,它不起作用。

与我在一开始提到的漂亮干净的 PowerShell 命令相比,像 this look a bit hacky to me, the general instructions for batch variables does not help in this case and all of these approaches 这样的解决方案在语法方面非常丑陋。 此外,none 其中包括时区,这对我来说很重要。

  • 您需要调用 powershell.exe、Windows PowerShell 的 CLI,以便从中执行 PowerShell 命令批处理文件 - 请注意,这样的调用很昂贵。

  • 您需要通过批处理文件中的 for /f 循环来解析输出; 运行 for /?cmd.exe 会话(命令提示符)寻求帮助。

  • 您需要 double % 个批处理文件应该处理的字符 verbatim.

总而言之:

@echo off

for /f "usebackq delims=" %%i in (`
  powershell -c "(Get-Date -UFormat '%%d-%%m-%%Y--%%R-UTC%%Z') -replace ':', '.'"
`) do set _timestamp=%%i

echo %_timestamp%

注意:考虑将 -noprofile 放在 -c 之前以抑制 PowerShell profiles 的加载,以获得更好的性能和可预测的执行环境。