I have a Windows batch file with command of several lines that I want to filter the output to set a variable and do some math:
@echo off
(
echo sel vol c
echo shrink querymax
echo exit
) | diskpart.exe | findstr "MB)"
That outouts:
The maximum number of reclaimable bytes is: 863 GB (884312 MB)
How can I set a variable (ie size1
) just containing the number inside the (
)
, and then subtract from that 20000 to make a new variable.
Like this:
set /a "size2=%size1%-20000"
@ECHO OFF
SETLOCAL
FOR /f "tokens=2delims=(" %%e IN ('(echo sel vol c^&echo shrink querymax^&ECHO exit^) ^| diskpart.exe ^| findstr "MB)"') DO (
FOR /f %%y IN ("%%e") DO SET "size1=%%y"
)
SET /a size2=size1-20000
SET siz
GOTO :EOF
The single-quoted command in the first set of parentheses should be familiar. I added exit
to quite diskpart
. The carets are required to tell cmd
that the following symbol is part of the command-to-be-executed, not of the for
. This is termed escaping
those characters and the escape character
is ^
.
So the output if the diskpart
command is filtered by the findstr
and we pick the second token from the line using (
as the delimiter. (See for /?
for documentation (or thousands of examples on SO)
%%e
then gets anumber MB)
assigned to it, so is again tokenised by for/f
as a string, thos time picking the default first token and using the default delimiter set, which includes Space and assigning to %%y
thence to size1
.