вопрос по powershell
Есть такой кусок кода в пауэршелле:
$application = "C:\Program Files\7-zip\7z.exe"
$arguments = "a -tzip C:\xls.zip -r C:\results\xls\*.*"
$process = [Diagnostics.Process]::Start($application, $arguments)
do { } while (!$process.HasExited)
Copy-Item C:\xls.zip D:\backup\xls.zip"
Здесь запускается консольная тулза с параметрами, после чего в цикле ждем, когда процесс закончится, чтобы скопировать результат куда-либо. Ждать конца процесса необходимо, т.к. в ином случае копировать нам будет нечего.
вопрос: есть ли какой-то более красивый способ запустить консольную тулзу и продолжить выполнение скрипта после окончания процесса архивирования, но так чтобы обойтись без цикла. Мне кажется, должен быть более изящный способ.
severin, используйте jobs: get-help about_jobs
Lico :
severin, используйте jobs: get-help about_jobs
Спасибо за ответ.
Но jobs - это не совсем то, что мне нужно. Оно не запускает конкретные софтины в командной строке, как я понял. Хотя там тоже есть start-job и wait-job. То есть я не нашел там примеров запуска каких-либо тулзей через start-job, а только ps1-скриптов. Хотя неплохо было бы разжиться таким примерчиком, если он есть.
То, что было найдено - это System.Diagnostics.Process.WaitForExit() - дотнетовский класс.
И теперь вместо этого:
$process = [Diagnostics.Process]::Start($application, $arguments)
do { } while (!$process.HasExited)
пишу это:
$process = [Diagnostics.Process]::Start($application, $arguments)
$process.WaitForExit()
Такая лаконичная конструкция тоже работает:
[Diagnostics.Process]::Start($application, $arguments).WaitForExit()
Взято здесь:
Кто еще что знает, делитесь опытом, и желательно с конкретными примерами.
и что характерно, сам пауэршелл при этом потребляет процессорное время во время ожидания конца архивирования (судя по таскменеджеру). Вот это непонятно.