首页 > 解决方案 > 如何使用 for 命令从文本文件中捕获数据并将其设置为变量(Windows 命令提示符)

问题描述

情况

使用 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

但是,这会捕获下面的所有内容,并将最后一位数据存储(“Leaving DiskPart ...”)作为变量。不是第一个值。我怎样才能解决这个问题?一定有一些我没有想到的简单的东西。

标签: batch-filefor-loopcmd

解决方案


您是否愿意直接进入源代码并跳过文本处理?

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 显然是微软设定的课程。

$disk1 = (Get-Disk -Number 0).FriendlyName

推荐阅读