Как найти имя тома диска, а затем выполнить какое-то действие, если оно равно переменной? - PullRequest
0 голосов
/ 25 января 2019

Я бился головой о стену, пытаясь понять это.Во-первых, чтобы ответить на то, что, я уверен, будет задан вопрос, да, мне нужно использовать пакетный скрипт.Я уверен, что это намного проще в PowerShell или другом языке, но это должен быть Windows Batch Script (CMD).Я пытаюсь изменить дизайн этого сценария для использования в новых системах и старых системах в нашей компании.Более новые системы используют Windows Server 2012, в то время как более старые системы используют Windows Server 2008. Обе системы будут иметь 2 жестких диска, но разница между ними заключается в использовании второго жесткого диска.В старых системах второй диск используется как резервный диск.На более новой системе это не так.С точки зрения непрофессионала, вот что я хочу сделать:

IF ANY DISK VOLUME includes "Backup" in it's name (Caption)
    SET %buletter% to the Drive Letter
    SET other variables
ELSE
    SET the backup location to something else
    SET other variables

Я довольно легко смог найти способ найти имя тома диска со следующим:

FOR /f %%b IN ('wmic volume get DriveLetter^, Label ^| find "%lookfor%"') DO Stuff

Но я не понял, как обернуть оператор FOR в оператор IF.

Любая помощь приветствуется.

Спасибо

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вам не нужно изначально использовать IF,

  • , вы можете использовать поиск и использование условного выполнения при успехе && или при неудаче || или
  • инициализация переменной var и использование for / f для оценки выходных данных, а затем проверка ее определения.
  • Я бы исключил первый диск, проверив наличие BootVolume в расширенном предложении where

:: Q:\Test\2019\01\25\SO_54366874.cmd
@Echo off
Set "BackUpDrive="
for /f "usebackq tokens=1,2*" %%A in (`
    wmic volume where 'DriveType^="3" AND BootVolume^="FALSE" AND Label like "%%Backup%%"' get DriveLetter^,Label 2^>NUL ^| find ":"
`) Do Set "BackUpDrive=%%A"
If defined BackUpDrive (
    Echo Drive with label Backup found: %BackUpDrive%
    Rem other commands
) Else (
    Echo no drive with label Backup found
    Rem other commands
)

Пример вывода здесь:

> Q:\Test\2019\01\25\SO_54366874.cmd
Drive with label Backup found: D:
0 голосов
/ 25 января 2019

Используя идею @mirGantrophy о проверке версии ОС, я пришел к этому.

SET Version=
FOR /F "skip=1" %%v IN ('wmic os get version') DO IF NOT DEFINED Version set Version=%%v
FOR /F "delims=. tokens=1-3" %%a in ("%Version%") DO (
    SET Version.Major=%%a
    SET Version.Minor=%%b
    SET Version.Build=%%c
)

IF %Version.Major% LSS 10 GOTO Win2008
IF %Version.Major%==10 GOTO Win2012

:Win2008
FOR /F %%p IN ('wmic logicaldisk where "VolumeName='%lookfor%'" get Caption ^| find ":"') DO (
    SET buletter=%%p
    SET bootdrvltr=C:
)
GOTO SetLocalDrv

:Win2012
SET buloc=C:\Archive
SET bootdrvltr=D:
GOTO SetLocalDrv

:SetLocalDrv
SET localdrv=%bootdrvltr%\Bootdrv
0 голосов
/ 25 января 2019

Попробуйте это:

for /f "usebackq skip=1" %%p in (`wmic volume where "label like '%%Backup%%'" get Driveletter`) do echo Backup Drive is %%p

Единственная проблема - это даст пустую строку на последней итерации.

...