2016-12-21 8 views
1

Я пытался превратить вывод следующих двух команд в переменные, чтобы я мог использовать их в пакетном файле, однако у меня нет никаких Удача:Batch - FOR Loop to Turn Выход WMIC в переменную не работает

WMIC /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct WHERE (displayName="Emsisoft Anti-Malware" or displayName="Emsisoft Internet Security") GET displayName /value 
WMIC /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct WHERE (displayName="Emsisoft Anti-Malware" or displayName="Emsisoft Internet Security") GET pathToSignedReportingExe /value 

В принципе можно установить два разных продукта безопасности, и командный файл должен определить, какой из них. Так как папка потенциально может быть изменена во время установки, это самый безопасный способ определить, что похоже на вышеупомянутые две команды. К сожалению, я не могу получить вывод в переменные, чтобы использовать его.

Вот мой текущий тестовый скрипт:

@ECHO OFF 

for /f "tokens=2 delims==" %%f in ('WMIC /namespace:\\\\root\\SecurityCenter2 PATH AntiVirusProduct WHERE ^(displayName^="Emsisoft Anti-Malware" or displayName^="Emsisoft Internet Security"^) GET DisplayName /value ^| find "="') do set "EmsiProductName=%%f" 
ECHO %EmsiProductName% 

for /f "tokens=2 delims==" %%f in ('WMIC /namespace:\\\\root\\SecurityCenter2 PATH AntiVirusProduct WHERE ^(displayName^="Emsisoft Anti-Malware" or displayName^="Emsisoft Internet Security"^) GET pathToSignedReportingExe /value ^| find "="') do set "EmsiProductPath=%%f" 
ECHO %EmsiProductPath% 

PAUSE 

При запуске, вышеуказанные выходы две ошибки, которые говорят, «Описание = Сервер RPC недоступен.» Я попытался избежать котировок (и "", и \"), и не ускользнул от них, но результат тот же.

У меня нет идей, поэтому, если у кого-то есть предложения, я бы очень признателен.

+0

Но командные строки 'wmic' работают самостоятельно, не так ли? – aschipfl

+0

@aschipfl да, делаю. – GT500

+2

@ GT500 Попробуйте 'WHERE 'displayName как' Emsisoft %% '" '.Я думаю, что в ваших командах не может быть предполагаемого эффекта. Но вы можете заключить предложение 'where' в двойные кавычки и заключить имя продукта в одинарные кавычки. Это позволит вам избежать необходимости избегать чего-либо (даже если вы продолжаете использовать '=' вместо 'like'). – rojo

ответ

1

Поскольку большинство ответов было опубликовано в комментариях, я объясню, что разрешило это для тех, кто интересуется (и для тех, кто все еще публикует комментарии в предположении, что это не было разрешено).

Как указано, Noodles и aschipfl указали, что избегать обратной косой черты не было необходимости, и это вызывало проблемы. К сожалению, это была не единственная проблема с моим кодом. Как упоминалось выше, , похоже, проблема была связана с тем, чтобы избежать других символов, и скобки, казалось, были беспорядочными. Лучшим решением было удалить все экранирование и использовать кавычки вместо круглых скобок. rojo также рекомендовал использовать как вместо = в соответствии со значениями, которые я искал, которые прекрасно работали.

Для тех, кто хотел бы увидеть рабочий код, это то, что я закончил с:

FOR /F "tokens=2 delims==" %%F IN ('WMIC /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct WHERE "displayName like 'Emsisoft%%'" GET DisplayName /value ^| FIND "="') DO SET "EmsiProduct=%%F" 
FOR /F "tokens=2 delims==" %%F IN ('WMIC /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct WHERE "displayName like 'Emsisoft%%'" GET pathToSignedReportingExe /value ^| FIND "="') DO SET "TempEmsiProductDir=%%F" 
SET EmsiProductDir=%TempEmsiProductDir:~0,-15% 
SET EmsiProductDirDoubleSlash=%EmsiProductDir:\=\\% 

Для тех, кто интересуется третьей линии, я нужен только путь к папке, так Я удаляю последние 15 символов, чтобы удалить последнюю обратную косую черту и имя файла.

Что касается четвертой строки, часть командного файла вызывает WMIC для получения свойств файла, и для этого вам нужны пути с двойной обратной косой чертой (или она не будет работать), поэтому вместо использования другого цикла FOR, чтобы попытаться измените, что я использую :\=\\ в конце имени переменной, чтобы преобразовать обратную косую черту в двойную обратную косую черту. Я думаю, что this - это то, откуда я получил эту идею, но похоже, что есть более подробное объяснение этого in this article.

+0

Я приложил усилия, чтобы обеспечить первый ответ, и вы, кажется, полностью проигнорировали его! Что случилось с кодом, который я опубликовал за 17 часов до того, как вы разместили его? Самое меньшее, что вы могли бы сделать, это попробовать и отчитаться! – Compo

+0

@Compo Мне удастся решить проблему с моим кодом с помощью rojo, когда вы оставите свой ответ. rojo оставил свою информацию в комментарии, хотя, поэтому я не смог отметить это как ответ, поэтому я написал это, чтобы дать ему кредит и (в конце концов) отметить его как ответ, так как именно так я решил проблему. – GT500

+0

... и как указали лапша и вы сами, ваши команды все еще были неправы. Теперь код, который вы опубликовали, полностью игнорирует преимущество предложения «как» и включает код, не связанный с вашим исходным вопросом. – Compo

0

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

@Echo Off 
For /F "UseBackQ Skip=1 Delims=" %%A In (`WMIC^ 
/namespace:\\root\SecurityCenter2 PATH AntiVirusProduct^ 
Where "DisplayName Like 'Emsisoft%%'" Get pathToSignedProductExe`) Do (
    For /F "Tokens=*" %%B In ("%%~dpA") Do Set "EmsiProductPath=%%~B" 
Set EmsiProductPath 
Timeout -1 

Это совершенно непроверенные, потому что даже если бы я был с помощью ПК с Windows у меня не будет установлен антивирусный продукт.