Powershell запускает пакетные файлы в фоновом режиме, продолжает выполнение и позже ждет завершения пакетных файлов.

У меня есть сценарий powershell, который настраивает среду разработки. Во время этого процесса он вызывает несколько пакетных файлов.

Я хотел бы, чтобы сценарий powershell продолжал обработку до тех пор, пока он не достигнет точки в сценарии, где ему нужно, чтобы пакетные файлы были завершены.

Простой тестовый пакетный файл "md.cmd"

@echo Create directory
md testDirectory

Скрипт PowerShell

$job1 = Start-Job {d:\test\md.cmd}

# run some scripts

while($job1.state -eq "Running")
{
    # wait for batch files to end
}

# run some more script using what the batch file did

Проблема в том, что я не могу запустить пакетный файл с помощью Start-Job.

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


person skyfoot    schedule 30.01.2015    source источник


Ответы (3)


Это должно работать, пока вы правильно проверяете состояние задания:

$job1 = Start-Job {cmd /c d:\test\md.cmd}
#run some scripts
while($job1.state -eq "Running")
{
    #wait for batch files to end
}
#run some more script using what the batch file did
person arco444    schedule 30.01.2015
comment
Боюсь, это не работает. Раньше я пытался добавить cmd в блок сценариев, но не с аргументом /c. - person skyfoot; 30.01.2015
comment
Определить doesn't work? Что происходит, когда вы вводите Receive-Job для получения вывода? Вы уверены, что не сталкиваетесь с проблемой переменной пути, и каталог, который вы ожидаете увидеть, не создается где-либо еще? - person arco444; 30.01.2015
comment
И вы упомянули добавление cmd — вы заметили, что здесь используется $job1.state? Это будет ключом. А также ваш текущий тестовый файл cmd должен хотя бы иметь сон или что-то в этом роде, иначе он будет завершен к тому времени, когда вы доберетесь до проверки состояния задания. - person arco444; 30.01.2015
comment
Несмотря на то, что сценарий ps находится на моем рабочем столе, и я установил для d:\test каталог, созданный в c:\windows\system32. - person skyfoot; 30.01.2015
comment
Это потому, что именно здесь находится дом cmd. Вам также нужно сделать cd в пакетном сценарии. - person arco444; 30.01.2015

start-job существует только в версиях Powershell более поздних, чем 3.0, поэтому убедитесь, что у вас установлена ​​правильная версия.

person acbrown    schedule 08.06.2015

Вам нужно добавить Start-Sleep между Start-Job и while loop, чтобы избежать этой ошибки, потому что в случае вашего кода требуется доля секунды, чтобы обновить статус задания, когда цикл while уже запущен. Это приводит к тому, что $job1.state по-прежнему показывает «Idle», поэтому он никогда не войдет в цикл while.

$job1 = Start-Job {cmd /c d:\test\md.cmd}

Start-Sleep 5 # to give time to update job status

# run some scripts
while($job1.state -eq "Running")
{
    # wait for batch files to end
}
person socket_var    schedule 05.01.2018