Проблема с циклами FOR / F в пакетных файлах Windows - PullRequest
1 голос
/ 27 июля 2011

Поэтому я пытаюсь создать командный файл, который будет выполнять разные действия в зависимости от вывода другой программы.По сути, первая программа выводит некоторую информацию о состоянии шифрования жесткого диска.Вот вывод, когда диск не зашифрован

S:\>beinvvol.exe xlc
------------------------------------------------------------------------
BEInvVol, Utimaco Safeware AG - A member of the Sophos Group
Decommissioning Tool for fully SGN-encrypted Volumes
------------------------------------------------------------------------

&Info: SGN filter driver off
&Info: Target log-file "S:\BEInvVol.log"

------------------------------------------------------------------------
Listing info for the target volume(s) -command xlc
Date: 2011-07-26 13:31:01

[Volume C:]
Drive Type: DRIVE_FIXED
[Boot Sector]
Media Type: Plain -not SGN
Media Label:
Media Serial Number: {8C19-DCCD}
File System: NTFS
Size: 232.88 GB

А вот что вы получите, когда диск зашифрован

S:\>beinvvol.exe xle
------------------------------------------------------------------------
BEInvVol, Utimaco Safeware AG - A member of the Sophos Group
Decommissioning Tool for fully SGN-encrypted Volumes
------------------------------------------------------------------------

&Info: SGN filter driver off
&Info: Target log-file "S:\KeyDestroy\BEInvVol.log"

------------------------------------------------------------------------
Listing info for the target volume(s) -command xle
Date: 2011-07-26 12:41:48

[Volume E:]
Drive Type: DRIVE_FIXED
[Boot Sector]
Media Type: SGN -fully encrypted
SGN Media GUID: {83490018-50C3-B4E3-829E-ACE3B23C86D3}
File System: NTFS
Size: 298.09 GB
[KSA Original]
Sector Offset ..... 0x0000000000065ED8 (417496)
Byte Offset ....... 0x000000000CBDB000 (213757952)
Size in Sectors ... 0x15 (21)
Size in Bytes ..... 0x2A00 (10752)
[KSA Backup]
Sector Offset ..... 0x000000002542D660 (625137248)
Byte Offset ....... 0x0000004A85ACC000 (320070270976)
Size in Sectors ... 0x15 (21)
Size in Bytes ..... 0x2A00 (10752)

Аргументы "xlc" и "xle" предназначены длявыбирая диск.Итак, я вижу, что в незашифрованном диске для «Типа носителя» у меня есть «Обычный-не SGN», а для зашифрованного драйвера у меня есть «Зашифрованный SGN»

Теперь япытаясь написать цикл FOR / F, который, когда он увидит «Plain -not SGN», перейдет в другую часть файла.Вот мой пакетный скрипт на данный момент:

@ECHO OFF
::Determine if drive is encrypted
FOR /F "tokens=3,4,5 delims= " %%A IN ('S:\beinvvol.exe xlc') DO IF /I "%%A%%B%%C"=="Plain-notSGN" GOTO NOTENCRYPTED

:ENCRYPTED
ECHO Yes
GOTO END

:NOTENCRYPTED
ECHO No

:END

Теперь мой мыслительный процесс - возьмите 3-й, 4-й и 5-й токены в списке (для интересующей меня строки 1-й токен будетбудет "Media", 2nd будет "Type:", а 3-й, 4-й и 5-й будут либо "Plain" "-not" и "SGN", либо "SGN" "-ful" "encrypted"), затем посмотритеесли эти строки будут равны "Plain-notSGN" (просто объединяя все эти строки).Однако это не работает.Есть предложения?

Ответы [ 3 ]

1 голос
/ 27 июля 2011
::Test the file passed in via command line
FOR /F "usebackq tokens=4" %%G IN (`S:\beinvvol.exe xlc ^| FIND "-not"`) DO (
  IF "%%G"=="-not" GOTO NOT_ENCRYPTED
)

:ENCRYPTED
ECHO Yes
GOTO END

:NOT_ENCRYPTED
ECHO No

:END
1 голос
/ 28 июля 2011

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Но использовать его вместе с циклом FOR в этой ситуации немного излишне, я думаю.

Вот как вы можете использовать FIND без цикла:

beinvvol.exe xlc | FIND /I "Plain -not SGN" >NUL && (ECHO No) || (ECHO Yes)

Переключатель /I просто указывает FIND игнорировать регистр при поиске ключевой фразы, бит >NUL отбрасывает вывод FIND. Два оператора && и || управляют потоком выполнения в зависимости от результата последней выполненной команды, в данном случае FIND. Команда после && выполняется в случае логического результата «Успех» и после || в случае логического «Неудача».

Конечно, вы можете использовать GOTO команды вместо ECHO.

beinvvol.exe xlc | FIND /I "Plain -not SGN" >NUL && (GOTO NotEncr) || (GOTO Encr)

:NotEncr
…

:Encr
…

Также вы можете использовать только && или только ||:

beinvvol.exe xlc | FIND /I "Plain -not SGN" >NUL && GOTO NotEncr
:: The following commands are executed in case of an encrypted drive
…

:NotEncr
…
0 голосов
/ 27 июля 2011

Попробуйте:

@Echo off
::Test the file passed in via command line
FOR /F "tokens=3,4,5 skip=15" %%G IN (%1) DO IF Plain-notSGN == %%G%%H%%I GOTO NOT_ENCRYPTED

:ENCRYPTED
ECHO Yes
GOTO END

:NOT_ENCRYPTED
ECHO No

:END

Возможно, вам придется сначала направить или перенаправить результаты вашей утилиты в текстовые файлы, но, похоже, это позволяет успешно провести различие между двумя опубликованными вами результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...