Ваша проблема заключается в следующем:
for /f "tokens=2 delims=: " %%a in (...
"delims=: "
не означает «разделить двоеточием плюс пробел», но «разделить двоеточием и пробел "(разделители состоят только из одного символа; строка переводится в несколько разделителей из одного символа).
Так что tokens=2
- это не то, что вам нужно. Вам нужна строка после (первого) двоеточия:
for /f "tokens=1,* delims=:" %%a in (...
, где %%a
- часть перед первым двоеточием, а %%b
- часть после первого двоеточия (*
означает «не оставьте токенизацию, но примите это как один токен "). К сожалению, пробел после двоеточия является частью %%b
, но вы можете удалить его (при необходимости) с подстановкой подстрок:
set "line=%%b"
set "line=!line:~1!"
(конечно, вам нужно отложенное расширение для этого.
или более элегантно с другим for
:
for /f "tokens=1,* delims=:" %%a in ('dism /get-mountedimageinfo ^| findstr /ibc:"Mount Dir" /ibc:"Status"') do (
for /f "tokens=*" %%c in ("%%b") do (
echo "%%c"
)
)
Редактировать
Согласно вашему комментарию, вы хотите знать, если и литеральный путь D:\mount
и строка Needs Remount
встречаются в выходных данных? Тогда следующий подход более прямолинейен:
for /f %%a in ('dism /get-mountedimageinfo ^| findstr /ixc:"Mount Dir : D:\mount" /ixc:"Status : Needs Remount"^|find /c ":"') do set count=%%a
if %count%==2 echo both strings found
(ищите обе строки и подсчитайте количество строк; сравните с ожидаемым "2"; нет необходимости фактически извлекать строки)