Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] При передачи данных из цикла For в подпрограмму происходит 2х кратный вызов последней (http://forum.oszone.net/showthread.php?t=313258)

8ash8 29-03-2016 19:12 2621025

При передачи данных из цикла For в подпрограмму происходит 2х кратный вызов последней
 
Добрый день, в процессе написания скрипта для удаления ПО столкнулся с такой проблемой: при передачи данных из цикла 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 2621047

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

Georgio 29-03-2016 20:56 2621067

Для надёжного разбора вывода команды "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

.


Время: 01:54.

Время: 01:54.
© OSzone.net 2001-