Перенаправить вывод пакетной команды в оператор if (и строковую ошибку?) - PullRequest
0 голосов
/ 12 ноября 2011

После небольшого исследования я нашел то, что выглядит неплохо для получения выходных данных пакетной команды и установки ее в переменную. Я использовал пример кода из блога: просто выродки, чтобы начать. Моя конечная цель - определить модель компьютера, на которой выполняется скрипт, и сделать что-то на основе какой модели. После небольшой модификации у меня есть:

FOR /F "tokens=* skip=1 delims=" %%A in ('wmic csproduct get name') do ( 
if %%A == "Vostro 430" goto vostro430
if %%A == "Optiplex 380" goto optiplex380
)
exit

:vostro430
REM do some stuff here

:optiplex380
REM do some stuff here

Полезно отметить, что wmic csproduct get name> sometextfile.txt в Vostro 430 (модель компьютера dell) представляет собой текстовый файл, который выглядит следующим образом:

Name
Vostro 430

Таким образом, приведенный выше код «должен» игнорировать первую строку и сравнить «Vostro 430» в операторах if, а затем перейти к одной из меток. Кажется, у меня есть какая-то ошибка, хотя, если я повторяю пакетный скрипт, я вижу, что он оценивает% A как пустое:

== "Vostro 430" goto vostro430
== "Optiplex 380" goto optiplex380

Есть идеи, где я облажался? Я подозреваю какую-то проблему со строкой или синтаксисом, но я не смог ее определить.

Ответы [ 3 ]

1 голос
/ 12 ноября 2011

Стандартный способ получить целую строку в команде for /F - через токены = * или delims = ", но не оба. Используйте только разделители следующим образом:

FOR /F "skip=1 delims=" %%A in ('wmic csproduct get name') do ( ...

Кроме того, вы должны добавитькавычки в значении %%A для правильного сравнения в команде if, как сказала афория.

1 голос
/ 13 ноября 2011

Как указала афория, вам нужны цитаты вокруг %%A.

Но главная проблема - это вывод команды wmic, как он выводит в формате Unicode.

Попробуйте этот код, чтобы увидеть эффект

FOR /F "tokens=* skip=1 delims=" %%A in ('wmic csproduct get name') do ( 
    echo .............1%%A2
)

На выходе будет что-то вроде

2............1TravelMate 7720
2............1

Что здесь происходит? К строкам добавляется символ <CR>, поэтому 2 будет напечатан в позиции 1 строки.

Вы можете избежать этого, просто удалив последний символ из %%A

setlocal EnableDelayedExpansion
FOR /F "tokens=* skip=1 delims=" %%A in ('wmic csproduct get name') do ( 
    set "line=%%A"
    set "line=!line:~0,-1!"
    echo "!line!"
)

Или вы используете команду TYPE, чтобы нормализовать вывод

wmic csproduct get name > wmicOutput.tmp
FOR /F "tokens=* skip=1 delims=" %%A in ('type wmicOutput.tmp') do ( 
    echo Works too "%%A"
    if "%%A"== "Vostro 430" goto :Vostro
)
1 голос
/ 12 ноября 2011

Попробуйте добавить кавычки вокруг %%A ... вот так:

if "%%A" == "Vostro 430" goto vostro430
if "%%A" == "Optiplex 380" goto optiplex380
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...