如何使用for命令从文本文件捕获数据并将其设置为变量(Windows命令提示符)

时间:2019-02-08 15:45:05

标签: batch-file for-loop cmd

情况

使用Diskpart可以获得详细信息,如下所示:

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

但是,这捕获了下面的所有内容,最后数据的一部分(“ Leave DiskPart ...”)被存储为变量。不是第一个值。我怎样才能解决这个问题?肯定有一些我没想到的简单事情。

3 个答案:

答案 0 :(得分:2)

如果您不愿意从命令行运行它,我认为这是您唯一的选择。

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

但是由于您用批处理文件标记了此问题,所以可以使用GOTO命令。

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

答案 1 :(得分:2)

您希望直接进入源代码并跳过文本处理吗?

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

答案 2 :(得分:1)

您还可以利用WMIC来执行此操作,与DiskPart方法不同,该方法不需要以管理员身份运行,也不需要将输出写入文件并读取回到待解析

@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