Войти

Показать полную графическую версию : [решено] При передачи данных из цикла For в подпрограмму происходит 2х кратный вызов последней


8ash8
29-03-2016, 19:12
Добрый день, в процессе написания скрипта для удаления ПО столкнулся с такой проблемой: при передачи данных из цикла For в подпрограмму происходит 2х кратный вызов последней и как следствие остается 2 записи в логах.


cls
set X=%~dp0
For /F "tokens=2 delims==" %%A In ('WMIC PRODUCT Where "Name LIKE 'Adobe%% Reader%%'" GET Name^, IdentifyingNumber /value^|Findstr "="') Do (set Arg=%%A & Call :De1 Arg)
:De1
if %Arg:~0,1% neq { (echo %Arg% >> "%X%Insid.txt") else (
START /WAIT MsiExec.exe /X%Arg% /qn /norestart)
Exit /B

в логе пишет:
Adobe Acrobat Reader DC - Russian
Adobe Acrobat Reader DC - Russian
Отсюда 2 вопроса:
1. Почему так происходит.
2. Как это исправить (обойти).

megaloman
29-03-2016, 20:00
Перед :De1 вставить строку GoTo :Eof либо Exit, если надо, с ключом.
(1) Инструкции обрабатываются последовательно.
:De1 это метка
сначала в for вы вызываете кусок кода по метке :De1 как процедуру. После выполнения For переходим к выполнению следующей инструкции. Метка она и в Африке метка и никак не влияет на выполнение программы, если на неё не ссылаться.
Поэтому при окончании кода головной части батника отделите её от процедуры GoTo :Eof либо Exit
И вообще, каждую процедуру, если их несколько, надо отделять от последующей, GoTo :Eof либо Exit, так как см. (1)
Полезно еще прочитать хелп (в командной строке Call /?)

Georgio
29-03-2016, 20:56
Для надёжного разбора вывода команды "WMIC" лучше использовать такой код:

@echo off

for /f "tokens=1,2 delims==" %%A in ('
wmic product where "Name like 'Adobe%% Reader%%'" get Name^, IdentifyingNumber /value
') do (
for /f "delims=" %%C in ("%%B") do (
if /i "%%A" neq "IdentifyingNumber" (
echo %%C>>"%~dp0Insid.txt"
) else (
start /wait MsiExec.exe /x%%C /qn /norestart
)
)
)

exit /b

.




© OSzone.net 2001-2012