Проблема вы видите возникает из тот факт, что вывод 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%
Проблема заключается не в том, чтобы вывести результат в переменную, а в том, что 'wmic' не работает должным образом. У него есть некоторые дополнительные 'CR' на концах строк, не знаю, сколько именно (1-3?). – Endoro
Я знаю, это 3 линии. Один выше и один ниже. Но я теперь это сделал, избегая wmic. – MokiTa