2013-07-09 5 views
1

Я работаю над пакетным скриптом для удовольствия и обучения.Вставить ввод в переменную

Я настроил несколько вариантов, например, Fint IP-адрес, MAC-адрес ... и так далее. Проблема в том, что я не могу узнать, как я могу вставить вывод этих двух строк в переменные.

for /f "usebackq skip=1" %%f in (`wmic COMPUTERSYSTEM get name`) do ??? 
for /f "usebackq skip=1" %%f in (`wmic COMPUTERSYSTEM get domain`) do ??? 

Поэтому я могу использовать вывод в предложении типа;

Ваше DNS-имя% dns_name_output%, а ваш домен% domain_name_output%.

+0

Проблема заключается не в том, чтобы вывести результат в переменную, а в том, что 'wmic' не работает должным образом. У него есть некоторые дополнительные 'CR' на концах строк, не знаю, сколько именно (1-3?). – Endoro

+0

Я знаю, это 3 линии. Один выше и один ниже. Но я теперь это сделал, избегая wmic. – MokiTa

ответ

1

Это работает с использованием wmic без каких-либо нечетных пространств или встроенных CR.

@echo off 
for /f "tokens=2 delims=<>" %%a in ('wmic COMPUTERSYSTEM get name /format:htable^|find "hidden"') do set "name=%%a" 
for /f "tokens=2 delims=<>" %%a in ('wmic COMPUTERSYSTEM get domain /format:htable^|find "hidden"') do set "dom=%%a" 
echo "%name%,%dom%" 
pause 
-1

Вы можете определить переменную и присвоить ее значение результату команды, используя корпус обратного тика.

Попробуйте это:

a=`ls` 
echo $a 
+0

пакет, а не _bash_. – Endoro

2

попробовать это:

for /f %%f in ("%computername%") do set "name=%%f" 
for /f %%f in ("%userdomain%") do set "domain=%%f" 
echo %name% %domain% 
+0

Нет, это не сработало. – MokiTa

+1

Спасибо, он работал лучше с переменными. Но мне пришлось использовать% userdomain% вместо% logonserver%. Тогда он работал нормально :) – MokiTa

+0

Зачем использовать FOR/F вообще, если ссылаться на стандартные переменные? Используйте стандартные переменные напрямую или напрямую присваивайте значения новым переменным. – dbenham

2

Для захвата wmic получить выход, используйте /value флаг, как этот

for /f "tokens=2 delims==" %%A in ('wmic computersystem get name /value') do set "Name=%%A" 
for /f "tokens=2 delims==" %%A in ('wmic computersystem get domain /value') do set "Domain=%%A" 
+2

Почти идеальный, за исключением назначенных значений, будет скрытый символ '' в конце. Символ '' будет лишен обычного расширения переменной, но это может вызвать проблему с задержкой расширения. – dbenham

+0

@dbenham +1 и это полезно знать. Я знал о скрытом характере, но не знал, что это вызвало проблему, поскольку я стараюсь не использовать задержанное расширение. В чем проблема? Я просто догадываюсь, что он выводит скрытый символ с задержкой расширения, потому что он возникает после того, как интерпретатор выполнил проверку этой команды. Это верно? –

+0

Да - вот как это может вызвать проблемы с задержкой расширения. Это может быть особенно неприятно при использовании в качестве части сравнения IF. – dbenham

2

Проблема вы видите возникает из тот факт, что вывод WMIC находится в Юникоде. По некоторым механизмам, которые я не совсем понимаю (ошибка?), Команда FOR/F преобразует вывод команды unicode в ASCII, но таинственно добавляет дополнительный возврат каретки (<CR>) в конце каждой строки.

FOR/F не возвращает пустые строки, но таинственные и, казалось бы, пустые строки не совсем пусты - они содержат <CR>.

Даже если лишние строки должным образом игнорируются, последнее значение в списке будет содержать нежелательный <CR>, который включается при назначении значения переменной окружения. <CR> не будет очевидным, если переменная впоследствии будет расширена, как правило, с использованием %VAR%, потому что парсер команд автоматически разделяет все символы <CR>. Но <CR> сохраняется и может вызвать проблемы, если используется замедленное расширение !VAR!.

Команда FOR/F передает последний символ из каждой строки, если это <CR>. Таким образом, передача значения через дополнительный FOR/F устранит проблему. Предложение Дэвида Рухмана использовать переключатель /value является хорошим и может быть улучшено. Несколько значений могут запрашиваться в одном цикле, а имя свойства может использоваться как имя переменной. Наличие только одной пары имя/значение в строке устраняет потенциальные проблемы синтаксического анализа с пробелами и/или запятыми в значениях.

В запятой FOR/F запятые в команде WMIC должны либо экранироваться, либо указываться. В этом случае цитирование всей команды кажется самым простым. Ниже будут правильно определены две переменные среды: домен и имя:

for /f "delims=" %%A in ('"wmic computersystem get domain, name /value"') do (
    for /f "tokens=1* delims==" %%B in ("%%A") do set "%%B=%%C" 
) 
echo Your host name is %name% and your domain is %domain% 
+0

Большое спасибо! Я не лучший в пакетном скриптинге, как вы видите, поэтому у меня есть последний вопрос: Как мне получить эти две строки, которые вы объединили, в переменную, которую я могу использовать для эха? Теперь я чувствую себя немного немой, ха-ха. – MokiTa

+0

@MokiTa - ??? Строки находятся в переменных, поэтому я немного смущен вашим вопросом. Но я обновил свой ответ, чтобы показать пример использования полученных переменных. – dbenham

+0

Ах, конечно, ха-ха! Как я мог этого не видеть. Я очень ценю, что вы даже потрудились ответить на мой глупый вопрос. Благодаря! – MokiTa

Смежные вопросы