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

And*_* L. 0 powershell timestamp batch-file batch-processing timestamp-with-timezone

我想在 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
Run Code Online (Sandbox Code Playgroud)

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

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

然而,它不起作用。

像这样的解决方案对我来说看起来有点老套,批处理变量的一般说明在这种情况下没有帮助,并且与我在一开始提到的漂亮干净的 PowerShell 命令相比,所有这些方法在语法方面都非常丑陋。此外,它们都不包括时区,这对我来说很重要。

mkl*_*nt0 5

  • 您需要调用powershell.exeWindows PowerShell 的CLI,以便从批处理文件执行PowerShell命令- 请注意,此类调用的成本很高。

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

  • 您需要将批处理文件应逐字处理的字符加倍%

把它们放在一起:

@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%
Run Code Online (Sandbox Code Playgroud)

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