Цитата:
Цитата Michael
При выполнении видно, что значение переменной MY_ERRORLEVEL1 в процесс yyy.cmd передается и им можно воспользоваться. »
|
Не так. Создаётся
копия окружения родительского процесса «cmd.exe» (в котором исполняется пакетный файл «xxx.cmd»), и порождённый процесс «cmd.exe» (в котором исполняется пакетный файл «yyy.cmd») работает именно с ней.
Цитата:
Цитата Michael
Затем происходит изменение переменной MY_ERRORLEVEL1 и выход из файла. При этом новое значение переменной MY_ERRORLEVEL1 в процессе xxx.cmd (в родительском) не доступно, оно осталось старым и равно 1. »
|
Оно и не будет доступно, поскольку изменение происходит в окружении
порождённого процесса «cmd.exe», являющемся
копией окружения родительского процесса «cmd.exe».
Цитата:
Цитата Michael
Вопрос - как в дочернем процессе изменить значение переменной, определенной в родительском процессе? Причем изменить так, чтобы новое значение было доступно в родительском процессе? »
|
Ответ: в рамках заданной категории и выбранного механизма исполнения — никак.
Цитата:
Цитата Michael
P.S. общая задача такова - необходимо сделать бэкап 9 папок с разных компов. При этом, для экономии времени, копирование запускается в 9 процессов. При этом, на время выполнения дочерних процессов копирования, родительский процесс встает на паузу (ping -n 500 localhost > nul). Копирование может закончится ошибкой доступа - поэтому хочу возвращать из дочернего процесса значение переменной %ERRORLEVEL%, значение которой присвою переменным MY_ERRORLEVEL1..MY_ERRORLEVEL9 »
|
Задача понятна.
Суть проблемы в том, что мы можем либо исполнять последовательно, получая результат по ErrorLevel/ExitCode дочернего процесса, либо, как у Вас, параллельно — не имея возможности получить результат исполнения по ErrorLevel/ExitCode дочернего процесса.
Я бы подумал о переходе на WSH («WshRemote»), либо PowerShell («WinRM»). Если никак — попробуйте, например, писать результат из дочерних пакетных файлов в единый текстовый файл, по строчке на машину. Родительский пакетный файл очищает/удаляет его, затем запускает по «start» N порождённых пакетных файлов отдельно. Каждый из них по исполнении дописывает свой результат в единый текстовый файл. Всё это время, родительский пакетный файл в бесконечном цикле ожидания раз, допустим, в пять секунд проверяет этот текстовый файл на предмет наличия в нём записей от всех порождённых дочерних файлов. Как только все записи окажутся в наличии — происходит выход из цикла ожидания, разбор этого текстового файла и вывод результатов.