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

Posted

技术标签:

【中文标题】将 PowerShell 命令结果分配给批处理脚本中的变量【英文标题】:Assign PowerShell command result to variable within Batch-Script 【发布时间】:2022-01-04 15:29:40 【问题描述】:

我想在批处理脚本中也能在 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 ":", "." ')

但是,它不起作用。

像this 这样的解决方案在我看来有点老套,general instructions for batch variables 在这种情况下没有帮助,与我在一开始。 此外,它们都不包括时区,这对我来说很重要。

【问题讨论】:

捕获命令输出以分配给变量的语法可能很难看,但您的答案肯定在您链接到的最后一个问题中,您会发现更多具有相同语法的问题和答案. 下面@mklement0 的回答已经证明,有一种方法可以利用 PowerShell 命令,它允许使用完全相同的语法。 mklement0 在他的回答中使用的语法与您在原始问题中链接到的answer 中使用的语法相同。您基本上只有两个选项来捕获批处理文件中命令的输出。您要么使用FOR /F 命令,要么写入文件并使用SET /P 或另一个FOR /F 命令将其读回。 虽然其他问题中的一些替代答案确实可能有效,但我是 PowerShell 命令的新手,不知道如何根据我的特定需求调整所述答案。因此,我很感激 @mklement0 在他对我的问题的回答中构建了它。 【参考方案1】:

您需要调用 powershell.exe,Windows PowerShell 的 CLI,以便从 批处理文件 执行 PowerShell 命令 - 请注意,这样的调用成本很高.

或者,要使用按需安装、跨平台的PowerShell (Core) 7+ 版本,请致电pwsh.exe

您需要通过批处理文件中的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%

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

【讨论】:

以上是关于将 PowerShell 命令结果分配给批处理脚本中的变量的主要内容,如果未能解决你的问题,请参考以下文章

运行多个 Powershell 命令并将结果导出到 csv

将当前时间分配给powershell变量

通过命令行将变量传递给powershell脚本

PowerShell 将命名参数传递给 ArgumentList

我正在使用来自 python 的 powershell 命令获取一些数据,而 Windows 中没有 cmd!如何将此输出分配给字符串变量?

如何给PowerShell脚本加密