Как я могу захватить данные с помощью команды for из текстового файла и установить его в качестве переменной (командная строка Windows) - PullRequest
0 голосов
/ 08 февраля 2019

Ситуация

Используя Diskpart, я могу получить информацию DETAIL DISK, которая выглядит следующим образом:

Microsoft DiskPart version 10.0.17763.1

Copyright (C) Microsoft Corporation.
On computer: PC

Disk 1 is now the selected disk.

Samsung SSD 960 EVO 500GB
Disk ID: {00000}
Type   : NVMe
Status : Online
Path   : 0
Target : 0
LUN ID : 0
Location Path : PCIROOT(0)#PCI(1D00)#PCI(0000)#NVME(P00T00L00)
Current Read-only State : No
Read-only  : No
Boot Disk  : Yes
Pagefile Disk  : Yes
Hibernation File Disk  : No
Crashdump Disk  : Yes
Clustered Disk  : No

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------

Leaving DiskPart...

Текст, который я хочу записать, это «Samsung SSD 960 EVO 500GB» Очевидно, когда язапустите его в системе с другим диском, эта информация изменится, поэтому это может быть диск Western Digital или Seagate и т. д.

Я думал об использовании:

for /f "skip=7 delims=" %g in (disk1.txt) do set disk1=%g

Однако, это захватывает все ниже и последний бит данных сохраняется («Выход из DiskPart ...») как переменная.Не первое значение.Как я могу это исправить?Должно быть что-то простое, о чем я не думал.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вы бы предпочли перейти непосредственно к источнику и пропустить обработку текста?

FOR /F "delims=" %%s IN ('powershell -NoLogo -NoProfile -Command "(Get-CimInstance -ClassName CIM_DiskDrive).Model"') DO (SET "DISK1=%%s")

Хорошая идея, @ LotPings.

FOR /F "delims=" %%s IN ('powershell -NoLogo -NoProfile -Command "(Get-Disk).FriendlyName"') DO (SET "DISK1=%%s")

Учитывая, что это может вернуть массив,выберите какой из них с помощью параметра -Number.

FOR /F "delims=" %%s IN ('powershell -NoLogo -NoProfile -Command "(Get-Disk -Number 0).FriendlyName"') DO (SET "DISK1=%%s")

Это еще проще, если вы начнете писать сценарии PowerShell вместо файлов .bat.PowerShell - это курс, который Microsoft установила.

$disk1 = (Get-Disk -Number 0).FriendlyName
0 голосов
/ 08 февраля 2019

Вы также можете использовать WMIC для этого, что в отличие от DiskPart метода не требует Запуск от имени администратора и не требует, чтобы вывод записывался в файл и считывался обратно, чтобы бытьparsed :

@For /F "Skip=1Delims=" %%A In ('WMIC DiskDrive Where "Index=1" Get Model')Do @For /F Tokens^=* %%B In ("%%A")Do @Set "_=%%B"

Чтобы проверить, сработало ли это, добавьте следующую строку под ним:

@Set _&Pause
0 голосов
/ 08 февраля 2019

Если вы не настроены на запуск этого из командной строки, я думаю, что это будет ваш единственный вариант.

set "disk1=" & for /f "skip=7 delims=" %g in (disk1.txt) do IF NOT DEFINED disk1 set "disk1=%g"

Но так как вы пометили этот вопрос с помощью Batch File, вы можете использовать команду GOTO.

for /f "skip=7 delims=" %%g in (disk1.txt) do (set "disk1=%%g" & goto done)
:done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...