Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Изменение глобальной переменной в дочернем процессе.

Ответить
Настройки темы
CMD/BAT - [решено] Изменение глобальной переменной в дочернем процессе.

Экзорцист


Сообщения: 969
Благодарности: 127

Профиль | Отправить PM | Цитировать


Здравствуйте.
Помогите разобраться. Есть два исполняемых фала со следующим содержимым:
xxx.cmd
Код: Выделить весь код
echo off
SET MY_ERRORLEVEL1=1
echo xxx1 MY_ERRORLEVEL1=%MY_ERRORLEVEL1%
pause
start yyy.cmd
echo xxx2 MY_ERRORLEVEL1=%MY_ERRORLEVEL1%
pause
pause
yyy.cmd
Код: Выделить весь код
echo off
echo yyy1 MY_ERRORLEVEL1=%MY_ERRORLEVEL1%
SET MY_ERRORLEVEL1=2
echo yyy2 MY_ERRORLEVEL1=%MY_ERRORLEVEL1%
pause
exit
Пользователь запускает файл xxx.cmd. В нем определяется переменная MY_ERRORLEVEL1. Затем из этого файла следует вызов дочернего файла yyy.cmd. При выполнении видно, что значение переменной MY_ERRORLEVEL1 в процесс yyy.cmd передается и им можно воспользоваться. Затем происходит изменение переменной MY_ERRORLEVEL1 и выход из файла. При этом новое значение переменной MY_ERRORLEVEL1 в процессе xxx.cmd (в родительском) не доступно, оно осталось старым и равно 1.
Вопрос - как в дочернем процессе изменить значение переменной, определенной в родительском процессе? Причем изменить так, чтобы новое значение было доступно в родительском процессе?
Спасибо.
P.S. общая задача такова - необходимо сделать бэкап 9 папок с разных компов. При этом, для экономии времени, копирование запускается в 9 процессов. При этом, на время выполнения дочерних процессов копирования, родительский процесс встает на паузу (ping -n 500 localhost > nul). Копирование может закончится ошибкой доступа - поэтому хочу возвращать из дочернего процесса значение переменной %ERRORLEVEL%, значение которой присвою переменным MY_ERRORLEVEL1..MY_ERRORLEVEL9

Отправлено: 11:24, 09-02-2015

 

Ветеран


Сообщения: 1759
Благодарности: 966

Профиль | Цитировать


Цитата Michael:
будет своя переменная ERRORLEVEL со своим значением »
Если его определить принудительно, то нет:
Код: Выделить весь код
@echo off
setlocal

set errorlevel=100
start /b 2.cmd
Код: Выделить весь код
:: 2.cmd

@echo off
setlocal

echo %errorlevel%
help > nul

:: Errorlevel должен бы стать равным 1, но:

echo %errorlevel%
exit /b

Отправлено: 11:47, 10-02-2015 | #11



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата Michael:
Iska, нет, меня интересует именно системная переменная ERRORLEVEL. Она будет своя в каждом процессе?
P.S. своя - в смысле независимая от других процессов. »
Michael, как бы Вам сказать… Ваш вопрос лишён смысла в озвученном контексте. Такой системной переменной окружения нет.

Псевдопеременная же окружения ERRORLEVEL доступна только при включённой расширенной обработке команд (которая, впрочем, включена по умолчанию). Она вычисляется динамически, в момент раскрытия (т.е., на неё действуют все правила раскрытия обычных переменных окружения) и принимает значение кода ошибки (кода возврата), если тот был установлен одной из предыдущих внутренних или внешних команд. Если Вы принудительно определите её по «set» — получите обычную переменную окружения с тем же именем.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:08, 10-02-2015 | #12


Ветеран


Сообщения: 2205
Благодарности: 730

Профиль | Отправить PM | Цитировать


Правильно ли я понял, что переменную дочернего процесса не получить в родительском?
Код: Выделить весь код
@echo off

cmd /v/c "set n=5& echo !n!& pause"
if defined n echo %n%

pause
exit
п.с. как вариант вижу решение через запись в текстовый файл и чтение из него, но может есть и иные варианты?

Последний раз редактировалось sov44, 16-10-2016 в 19:09.


Отправлено: 18:38, 16-10-2016 | #13


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата sov44:
Правильно ли я понял, что переменную дочернего процесса не получить в родительском? »
Вы правильно поняли. Потому что родительский и дочерний процесс имеют каждый по своей независимой копии области переменных окружения.

Цитата sov44:
п.с. как вариант вижу решение через запись в текстовый файл и чтение из него, но может есть и иные варианты? »
А что Вам нужно сделать? Интересует сама задача, а не выбранное Вами решение.

Отправлено: 20:03, 16-10-2016 | #14


Ветеран


Сообщения: 2205
Благодарности: 730

Профиль | Отправить PM | Цитировать


Задача простая - получить "рапорт" об исполнении задания дочернего процесса. Хотел через переменную, сделал через временный файл.
Под спойлером скрипт удаления не верных ярлыков. Вот только QL не смог победить ((

Скрытый текст
Код: Выделить весь код
@Echo Off
SetLocal enabledelayedexpansion

(
echo Set oShell = CreateObject^("WScript.Shell"^)
echo Set oShortcut = oShell.CreateShortcut^(Wscript.Arguments.Item^(0^)^)
echo WScript.Echo oShortcut.TargetPath
)>$.vbs
 
set dir1=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
set dir2=HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

Ver | Find "5." >Nul && call :L_XP
Ver | Find "6." >Nul && call :L_7

if exist f_lnk (echo    Очистка от не верных ярлыков ^(без QL^)         - OK)
if not exist f_lnk (echo    Очистка от не верных ярлыков ^(без QL^)         - --)
del $.vbs
del f_lnk
pause
exit

:L_XP
chcp 1251>nul
for %%a in ("%dir1%","%dir2%") do (
 for /f "tokens=1-2* delims=:" %%b in ('reg query "%%~a" ^|find ":"') do (
 chcp 866>nul& set r1=%%b
 cmd /v /c "for %%x in ("!r1:~-1!:%%c\*.lnk") do @for /f "delims=" %%y in ('cscript //nologo "$.vbs" "%%~x"') do @if not exist "%%~y" (del /f /q "%%~x"& >f_lnk echo.1)"
))
chcp 866>nul
exit /b

:L_7
for %%a in ("%dir1%","%dir2%") do (
 for /f "tokens=1-2* delims=:" %%b in ('reg query "%%~a" ^|find ":"') do (
 set r1=%%b
 cmd /v /c "for %%x in ("!r1:~-1!:%%c\*.lnk") do @for /f "delims=" %%y in ('cscript //nologo "$.vbs" "%%~x"') do @if not exist "%%~y" (del /f /q "%%~x"& >f_lnk echo.1)"
))
exit /b

Отправлено: 20:37, 16-10-2016 | #15


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата sov44:
Задача простая - получить "рапорт" об исполнении задания дочернего процесса. »
Более развёрнутый, нежели простой код возврата, так?

Цитата sov44:
Вот только QL не смог победить (( »
Что такое QL?

Отправлено: 21:21, 16-10-2016 | #16


Ветеран


Сообщения: 2205
Благодарности: 730

Профиль | Отправить PM | Цитировать


Цитата Iska:
Более развёрнутый, нежели простой код возврата, так? »
хм... интересны примеры реализации обеих вариантов.

Цитата Iska:
Что такое QL? »
Quick Launch, панель быстрого запуска в WinXP. В Windows 7 и выше её можно добавить в панель задач. Удаление не рабочих ярлыков с панели задач и панели быстрого запуска командой del не корректно, т.к. ярлыки "привязаны" к реестру, гибрид на vbs возможно с этим мог бы помочь.

Отправлено: 22:14, 16-10-2016 | #17


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата sov44:
хм... интересны примеры реализации обеих вариантов. »
Первый — call в родительском, exit /b … — в дочернем, и последующий анализ errorlevel в родительском же.

Второй — например, через тот же указанный Вами вариант со временным файлом. Единственно — в родительском использовать, скажем, процедуру получения имени временного файла: CMD/BAT: генерация пути для временного файла или папки — Коллекция скриптов и идей — Серый форум, передача этого полученного имени в дочерний через параметр, после возврата в родительский — анализ содержимого временного файла и удаление этого временного файла. Можно комбинировать с первым способом — например, можно условиться, что нулевой код возврата будет означать корректную работу дочернего пакетного файла (а разные не нулевые — ту или иную ошибку), а развёрнутые детали могут передаваться посредством временного файла.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:43, 16-10-2016 | #18



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Изменение глобальной переменной в дочернем процессе.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной. NiOl Скриптовые языки администрирования Windows 7 31-01-2019 19:58
CMD/BAT - [решено] В переменной содержится имя переменной opravdin Скриптовые языки администрирования Windows 3 28-01-2013 11:11
DNS в дочернем домене niklep Microsoft Windows NT/2000/2003 1 23-01-2012 10:49
V. 5.5/2000/2003 - Установка Exchange 2010 в дочернем домене. coldnet Microsoft Exchange Server 3 11-02-2011 14:00
[решено] Глобальный каталог в дочернем домене SanyaJoker Microsoft Windows NT/2000/2003 33 28-04-2009 14:47




 
Переход