喜欢在变量中获取 powershell 脚本的输出以在批处理文件中使用
Love to get the output of powershell script in a variable to use in a batch file
我有以下“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
我更喜欢用另一种方式。我认为它更容易理解,我讨厌 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
主要问题是 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%
我有以下“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
我更喜欢用另一种方式。我认为它更容易理解,我讨厌 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
主要问题是 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%