Найти несколько строк в несколько строк - PullRequest
0 голосов
/ 27 марта 2020

Я делаю скрипт, который может найти несколько строк в выводе команды. Например, вот мой вывод после выполнения команды:

Mount Dir : D:\mount
Image File : F:\sources\boot.wim
Image Index : 1
Mounted Read/Write : No
Status : Needs Remount

Я хочу, чтобы пакетный файл нашел строки "D: \ mount" и "Needs remount" в выводе, и они должны совпадать для вывода, но проблема в том, что он продолжает показывать неправильную строку:

Dir
Press any key to continue...
Needs
Press any key to continue...

Я знаю, что проблемы в разделителях, но даже если я изменю его, результаты все равно будут такими же. Вот код, который я использовал:

@echo off
for /f "tokens=2 delims=: " %%a in ('dism /get-mountedimageinfo ^| findstr /i /c:"Dir" /c:"status"') do (
@echo %%a
pause
)

Пожалуйста, помогите мне. Заранее спасибо

1 Ответ

1 голос
/ 27 марта 2020

Ваша проблема заключается в следующем:

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"; нет необходимости фактически извлекать строки)

...