Устранить лишние пробелы из WMIC - PullRequest
0 голосов
/ 06 мая 2019

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

Однако команда WMIC для серийного номера возвращает«T300» - «FDHGFJ» Запуск только серийного номера WMIC (без «wmic csproduct get version») не включает дополнительные пробелы.

Я попытался повторить цикл еще раз, как предлагают другие посты, но не повезло.

Ниже приведен полный код.

@ECHO ON
PUSHD "%~dp0"

setlocal EnableDelayedExpansion
for /f "usebackq skip=1 tokens=*" %%i in (`wmic bios get serialnumber ^| findstr /r /v "^$"`) do set "serialn=%%i"

for /f "usebackq skip=1 tokens=2 delims= " %%a in (`wmic csproduct get version ^| findstr /r /v "^$"`) do set "modeln=%%a"

ECHO "%modeln%"-"%serialn%" >>test.txt
POPD
exit

Я хочу получить окончательный результатбыть "T300" - "FDHGFJ", поскольку это может быть реализовано в последовательности задач.

Ответы [ 3 ]

0 голосов
/ 07 мая 2019

Команда wmic с ее глаголом get может заполнить возвращаемые данные путём следования ПРОБЕЛЫ , которые, как я полагаю, вы хотите удалить без удаления ПРОБЕЛЫ в самих возвращаемых значениях.

Для этого вам нужно изменить формат вывода, добавив параметр VALUE, например:

@echo off
setlocal EnableDelayedExpansion
cd /D "%~dp0."
for /F "tokens=1* delims==" %%I in ('wmic BIOS get SerialNumber /VALUE') do for /F "delims=" %%K in ("%%J") do set "serialn=%%K"
for /F "tokens=1* delims==" %%I in ('wmic CSProduct get Version /VALUE') do for /F "delims=" %%K in ("%%J") do set "modeln=%%K"
>> "test.txt" echo "%modeln%"-"%serialn%"
endlocal
exit /B

Кроме того, я изменил следующее:

  • Я поместил еще один цикл for /F внутри того, который анализирует вывод wmic, чтобы избежать артефактов преобразования Unicode в ASCII / ANSI на for /F, например, осиротевшая каретка.возвращаемые символы;
  • Я заменил пару pushd / popd на cd /D, поскольку setlocal / endlocal уже локализует среду, включая текущий рабочий каталог;
  • Я добавил явное endlocal просто для явного завершения локализации среды (хотя это все равно будет сделано после завершения пакетного скрипта);
  • Я заменил exit на exit /B, чтобы выйти только изкомандный файл буt не родительский cmd экземпляр;
  • Я поместил часть перенаправления >> "test.txt" перед командой echo, чтобы избежать пробела между последним закрытием " и >> (в вашем коде) тоже будет возвращено;
0 голосов
/ 07 мая 2019

Поскольку мой первоначальный комментарий относительно использования /Value уже реализован в ответе, этот вопрос расширяется при использовании формата CSV:

@Echo Off
SetLocal DisableDelayedExpansion
Set "DWM=%__AppDir__%wbem"

Rem Fixes 'Invalid XSL format (or) file name' errors in some Windows versions.
Set "CSV="
For /F "Delims=" %%A In ('"Dir /B/S/A-D "%DWM%\csv.xsl" 2>Nul"'
)Do If Not Defined CSV Set "CSV=%%A"
If Not Defined CSV Exit /B

Set "Serial#=Null"
For /F "Skip=2Tokens=1*Delims=," %%A In (
    '""%DWM%\wmic.exe" BIOS Get SerialNumber /Format:"%CSV%" 2>Nul"'
)Do For /F Tokens^=* %%C In ("%%~B")Do Set "Serial#=%%~C"

Set "Model#=Null"
For /F "Skip=2Tokens=1*Delims=," %%A In (
    '""%DWM%\wmic.exe" CSProduct Get Version /Format:"%CSV%" 2>Nul"'
)Do For /F Tokens^=* %%C In ("%%~B")Do Set "Model#=%%~C"

Echo "%Model#%"-"%Serial#%">>"test.txt"
Pause
0 голосов
/ 07 мая 2019

Вы можете попробовать немного взломать, установив переменную, только если она не определена.Я удалил "tokens=*" и "delims=", так как это получит всю строку.Затем мы просто делаем замену на пробел.

@echo off
set serialn=
set modeln=
for /f "usebackq skip=1" %%i in (`wmic bios get serialnumber`) do if not defined serialn set "serialn=%%i"
for /f "usebackq skip=1" %%a in (`wmic csproduct get version`) do if not defined modeln set "modeln=%%a"

echo "%modeln: =%"-"%serialn: =%">>test.txt

Примечание вывод второй строки на моем устройстве wmic csproduct get version имеет только одно значение, и поэтому мне пришлось изменить строку, если вашана самом деле есть 2 токена, то вы должны использовать исходную строку:

for /f "usebackq skip=1 tokens=2" %%a in (`wmic csproduct get version`) do if not defined modeln set "modeln=%%a"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...