从文本文件中的特定行拉出变量

时间:2015-12-09 17:42:33

标签: batch-file

我正在尝试写一个批处理文件,它将拉取计算机信息并将其导出到文本文件,即output.txt我有一个正确的。

wmic CSProduct get  vendor >> c:\output.txt
wmic CSProduct get  name >> c:\output.txt

这给了我一个包含

的output.txt

供应商
技嘉科技有限公司
名称
H61N-USB3

现在我需要一个批处理文件,将第2行和第4行转换为变量。我试过了

set "Name="
for /F "skip=1" %%a in (C:\output.txt) do if not defined Name set "Vend=%%a"
set "Name="
for /F "skip=3" %%b in (C:\output.txt) do if not defined Name set "Name=%%b"

REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation /V Model /T REG_SZ /D "Vend, Name" /F

但我无法让它发挥作用。我对批处理脚本完全不熟悉,也不知道我在做什么。

4 个答案:

答案 0 :(得分:3)

无需临时文件:

for /f "tokens=1,2 delims=," %%a in ('wmic CSProduct get vendor^,name^,version /format:csv') do (
  set vend=%%a
  set name=%%b
)
echo -%vend%-%name%-

wmic有难看的行结尾。有几种方法可以欺骗他们。在这里,我选择使用另一个令牌(“包含”行结尾),未使用(版本)

答案 1 :(得分:0)

set "Vend="
for /F "skip=1" %%a in (C:\output.txt) do if not defined Vend set "Vend=%%a"
set "Name="
for /F "skip=3" %%b in (C:\output.txt) do if not defined Name set "Name=%%b"

echo(%Vend% %Name%

如果您想在vend行中找到namereg的值,请使用%vend%%name%

基本上,皮肤#lines,将vaue分配给正确的变量。对于此后的每一行,由于变量是set,因此不要进行任何赋值。

啊 - 你可能想要整行,包括空格。

"skip=1"更改为"skip=1delims="

(将#skipped改为诉讼)

通过禁用分隔符,将整行读取分配给元变量%%a。默认分隔符ar( Space Tab ; )所以只有第一个“令牌”(直到第一个)找到分隔符)将被分配。

答案 2 :(得分:0)

你其实非常接近。

  1. 第一个Set "Name="应该是Set "Vend="
  2. 第一个for行同样应该引用not defined Vend而不是not defined Name
  3. 如果要跳过分隔符,请添加delims=以读取整个输入行。 (只需在命令行输入for /?,即可查看“for”选项的更多详细信息。)
  4. reg add行中,%%a%%b应该是您创建的环境变量%Vend%%Name%
  5. 所以,这应该有效:

    set Vend=
    for /F "skip=1 delims=" %%a in (C:\output.txt) do if not defined Vend set "Vend=%%a"
    set Name=
    for /F "skip=3 delims=" %%b in (C:\output.txt) do if not defined Name set "Name=%%b"
    
    REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation /V Model /T REG_SZ /D "%Vend%, %Name%" /F
    

答案 3 :(得分:0)

如果你问我,斯蒂芬是最好的解决方案,但这是另一种选择。

for /F "tokens=1,2 delims==" %%G IN ('wmic CSProduct get  vendor /value ^|find /i "vendor"') do SET %%G=%%H
for /F "tokens=1,2 delims==" %%G IN ('wmic CSProduct get  name /value ^|find /i "name"') do SET %%G=%%H
echo %Vendor% %Name%