将 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 命令批处理文件 - 请注意,这样的调用很昂贵。
- 或者,使用按需安装、跨平台 PowerShell (Core) 7+ edition, call
pwsh.exe
您需要通过批处理文件中的 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 的加载,以获得更好的性能和可预测的执行环境。
我想在批处理脚本中实现我在 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 命令批处理文件 - 请注意,这样的调用很昂贵。- 或者,使用按需安装、跨平台 PowerShell (Core) 7+ edition, call
pwsh.exe
- 或者,使用按需安装、跨平台 PowerShell (Core) 7+ edition, call
您需要通过批处理文件中的
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 的加载,以获得更好的性能和可预测的执行环境。