喜欢在变量中获取 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 脚本的输出以在批处理文件中使用的主要内容,如果未能解决你的问题,请参考以下文章