1

これを行うためのよりクリーンな方法を探しています。たとえそれがうまく機能していても、それは間違っていると確信しています。基本的に、ファイル (temp.txt) から次のような出力を取得しています。

    Host Name:                 IBM-3J93A46MRS5
    OS Name:                   Microsoft Windows 7 Professional 
    OS Version:                6.1.7631 Service Pack 1 Build 7601
    OS Configuration:          Standalone Workstation
    Registered Owner:          IAMADMIN
    Original Install Date:     2011-12-15, 10:56:07 AM
    System Boot Time:          2013-05-27, 9:55:36 AM
    System Manufacturer:       DELL
    System Model:              4009BF7
    Time Zone:                 (UTC-05:00) Eastern Time (US & Canada)
    Total Physical Memory:     16,316 MB
    Available Physical Memory: 11,356 MB

そして、データの2番目の列だけを変数に入れようとしています。欲しいか欲しくないかによる。私は Findstr を使って除草しています。

    @echo off
    setlocal enabledelayedexpansion

    systeminfo > temp.txt
    set "tmp_result_file=temp.txt"

    for /f "tokens=3-7 delims= " %%i in ('FINDSTR /C:"OS Name:" %tmp_result_file%') do set "OSNAME=%%i %%j %%k %%l"
    for /f "tokens=3-10 delims= " %%i in ('FINDSTR /V /C:"BIOS Version:" %tmp_result_file%^|FIND /I "OS Version:"') do set "OSVER=%%i %%j %%k %%l %%m %%n %%o %%p"
    for /f "tokens=4-7 delims= " %%i in ('FINDSTR /C:"Original Install Date:" %tmp_result_file%') do set "INSTDATE=%%i %%j %%k %%l"
    for /f "tokens=3-7 delims= " %%i in ('FINDSTR /C:"System Manufacturer:" %tmp_result_file%') do set "SYSMFG=%%i %%j %%k %%l"
    for /f "tokens=3-7 delims= " %%i in ('FINDSTR /C:"System Model:" %tmp_result_file%') do   set "SYSMDL=%%i %%j %%k %%l"

    echo.
    echo Operating System      : %OSNAME% , %OSVER% 
    echo Original Install Date : %INSTDATE%
    echo Model Information     : %SYSMFG% %SYSMDL% 

トークンをそれほど正確に使用するのは好きではありません。検索値の後にすべてが必要なだけです。

4

3 に答える 3

5

遅延拡張、一時ファイル、または FINDSTR は必要なく、スペースで区切られたトークンを数える必要もありません。正しい DELIMS および TOKENS オプションを設定するだけです。最初の FOR /F は、出力を処理し、systeminfo各行を名前と値に解析します。2 番目の FOR /F は、各値から先頭の空白を取り除きます。残っているのは、各名前をテストし、必要な変数を適切に設定するための一連の IF ステートメントだけです。

@echo off
setlocal

for /f "delims=: tokens=1*" %%A in ('systeminfo') do (
  for /f "tokens=*" %%S in ("%%B") do (
    if "%%A"=="OS Name" set "OSNAME=%%S"
    if "%%A"=="OS Version" set "OSVER=%%S"
    if "%%A"=="Original Install Date" set "INSTDATE=%%S"
    if "%%A"=="System Manufacturer" set "SYSMFG=%%S"
    if "%%A"=="System Model" set "SYSMDL=%%S"
  )
)

echo(
echo Operating System      : %OSNAME%, %OSVER%
echo Original Install Date : %INSTDATE%
echo Model Information     : %SYSMFG% %SYSMDL%

より多くの値を取得したい場合は、文字列を使用して検索文字列:変数名のペアを指定し、次のように各テストを処理するための FOR ループをいくつか追加することが望ましい場合があります。

@echo off
setlocal

for /f "delims=: tokens=1*" %%A in ('systeminfo') do for %%S in (
  "OS Name:OSNAME"
  "OS Version:OSVER"
  "Original Install Date:INSTDATE"
  "System Manufacturer:SYSMFG"
  "System Model:SYSMDL"
) do for /f "delims=: tokens=1*" %%a in ("%%~S") do if %%A==%%a (
  for /f "tokens=*" %%s in ("%%B") do set "%%b=%%s"
)

echo(
echo Operating System      : %OSNAME%, %OSVER%
echo Original Install Date : %INSTDATE%
echo Model Information     : %SYSMFG% %SYSMDL%
于 2013-06-26T19:46:50.003 に答える
0

3 番目のトークンの後に他のすべてを取得する必要がある場合は、次のようにトークン値にワイルドカードを使用するだけです。

for /f "tokens=3* delims= " %%i in ('FINDSTR /C:"OS Name:" %tmp_result_file%') do set "OSNAME=%%i"

表示する必要があります

Microsoft Windows 7 Professional
于 2013-06-26T18:27:19.483 に答える