喜欢在变量中获取 powershell 脚本的输出以在批处理文件中使用

Posted

技术标签:

【中文标题】喜欢在变量中获取 powershell 脚本的输出以在批处理文件中使用【英文标题】:Love to get the output of powershell script in a variable to use in a batch file 【发布时间】:2021-06-02 06:24:55 【问题描述】:

我有以下“powershell脚本”

Get-WMIObject -Query "SELECT * from win32_logicaldisk WHERE DriveType = '3'" | Measure-Object -Property Size -Sum | select -ExpandProperty SUm

我想用它来实现它,但我的 var 变量是空的。 我认为它与“或”有关,但我是新手,我对脚本的了解并不是那么好。 有人可以帮我解决这个愚蠢的事情吗?

FOR /F "tokens=* USEBACKQ" %%F IN (`powershell -noprofile Get-WMIObject -Query "SELECT * from win32_logicaldisk WHERE DriveType = '3'" | Measure-Object -Property Size -Sum | select -ExpandProperty SUm`) DO (
SET var=%%F

【问题讨论】:

你需要转义^| @Squashman - 我也是这么想的,但显然不止于此 如果您不熟悉脚本,我会说将 Powershell 管道嵌入到 CMD 批处理文件中。为什么不在 Powershell 中完成这一切?此时(此处为 Powershell 7),您只有 $size = (Get-CimInstance -Query "SELECT * from win32_logicaldisk WHERE DriveType = '3'" | Measure-Object -Property Size -Sum).Sum,然后您可以在 Powershell 脚本的其他地方引用它? 同意之前的评论 - 为什么要分批?为什么不对整个脚本使用 PowerShell? 你也可以看看Windows Command line get disk space in GB 【参考方案1】:

我更喜欢使用另一种方式。我认为它更容易理解,我讨厌 cmd 的 for 语法

:createTempFileLoop
set "MY_TEMPFILE=%TEMP%\my~%RANDOM%~%RANDOM%~%RANDOM%~%RANDOM%~%RANDOM%.cmd"
if exist "%MY_TEMPFILE%" goto :createTempFileLoop

SET MY_SUMSIZE=-1

@REM Variant powershell.exe -Command [IO.File]::WriteAllText('%MY_TEMPFILE%', 'SET MY_SUMSIZE='+(Get-WMIObject -Query 'SELECT * from win32_logicaldisk WHERE DriveType = ''3''' ^| Measure-Object -Property Size -Sum).SUM, [System.Text.Encoding]::ASCII)

powershell.exe -Command 'SET MY_SUMSIZE='+(Get-WMIObject -Query 'SELECT * from win32_logicaldisk WHERE DriveType = ''3''' ^| Measure-Object -Property Size -Sum).SUM > %MY_TEMPFILE%

call %MY_TEMPFILE%
DEL /Q /F %MY_TEMPFILE%
echo Size is %MY_SUMSIZE%
pause

【讨论】:

感谢您的解决方案,它确实与@SomethingDark 的解决方案形式相同【参考方案2】:

主要问题是 PowerShell 中的许多字符批量执行其他操作,它们会干扰 for 循环的工作方式。将其与进入for /F 循环的额外字符串处理层相结合,需要进行大量额外的转义。

最终,所有内容的引号和双引号加上转义内部引号似乎可以解决问题。

@echo off
FOR /F "tokens=* USEBACKQ" %%F IN (`powershell -noprofile "Get-WMIObject -Query \""SELECT * from win32_logicaldisk WHERE DriveType = '3'\"" | Measure-Object -Property Size -Sum | select -ExpandProperty Sum"`) DO (
    SET var=%%F
)
echo %var%

【讨论】:

非常感谢!从来没有用引号或双引号做对。 老实说,我只是尝试了一堆东西,直到它成功为止。 是否可以对结果进行四舍五入(%var%) 四舍五入到什么程度?我假设 powershell 具有某种舍入功能,但我看到的所有内容都是关于用小数舍入值,而且您的所有硬盘驱动器大小的总和不是整数,这有点奇怪 谢谢,@Aacini。 PowerShell 何时需要额外的东西才能正常工作很奇怪。我希望微软在默认情况下没有削弱它,这样它就可以像普通的脚本语言一样工作。

以上是关于喜欢在变量中获取 powershell 脚本的输出以在批处理文件中使用的主要内容,如果未能解决你的问题,请参考以下文章

当它是存储帐户连接字符串时,如何使用输出变量?

从PowerShell中使用参数和凭据启动.ps1脚本并从中获取输出

如何在 PowerShell 中输出内容

C# 中未获取 Powershell 结果集

如何在PowerShell中获取变量名称

powershell 这个powershell脚本从顶级目录获取ACl,然后将其与所有子目录和输出的ACL进行比较。