2

我有以下“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
4

2 回答 2

3

主要问题是 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%
于 2021-03-03T16:32:20.637 回答
2

我更喜欢使用另一种方式。我认为它更容易理解,我讨厌 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
于 2021-03-03T16:29:16.143 回答