Печать всех токенов после 2-го токена в пакетном скрипте
Я ищу более чистый способ сделать это. Я уверен, что это неправильно, хотя это и работает. В основном я беру вывод из файла (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%
Мне не нравится, что я так точно использую токены, мне просто нужно все после значения поиска.
3 ответа
Нет необходимости в отложенном расширении, временном файле или FINDSTR, и, конечно же, не нужно считать маркеры, разделенные пробелом. Вам просто нужно установить правильные параметры DELIMS и TOKENS. Первый FOR /F обрабатывает вывод systeminfo
и разбирает каждую строку на имя и значение. Второй 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%
Goi'n легкий путь :-)
@echo OFF &setlocal
FOR /f "tokens=1*delims=:" %%i IN (file) DO (
FOR /f "tokens=*" %%a IN ("%%j") DO SET "$%%i=%%a"
)
SET "$"
echo Windows version: %$OS Name%
..output это:
$ Доступной физической памяти = 11 356 МБ $Host Name=IBM-3J93A46MRS5 $Original Install Date=2011-12-15, 10:56:07 AM $OS Configuration= Автономная рабочая станция $OS Name=Microsoft Windows 7 Professional $OS Version=6.1.7631 с пакетом обновления 1, сборка 7601 $ Зарегистрированный владелец =IAMADMIN $System Boot Time=2013-05-27, 9:55:36 AM $ Производитель системы =DELL $System Model=4009BF7 $ Часовой пояс =(UTC-05:00) восточное время (США и Канада) Общая физическая память = 16 316 МБ Версия для Windows: Microsoft Windows 7 Профессиональная
Если вам нужно получить все остальное после 3-го токена, просто используйте подстановочный знак в значении токена следующим образом:-
for /f "tokens=3* delims= " %%i in ('FINDSTR /C:"OS Name:" %tmp_result_file%') do set "OSNAME=%%i"
должен отображать
Microsoft Windows 7 Professional