Сервісний центр VPSGroup ремонт комп'ютерної техніки, заправка картриджів, ремонт оргтехніки, Київ, Виставковий центр, Васильківська, 55

Запуск програми з PowerShell.

Завдання запустити з PowerShell будь-якої виконуваний файл (програму або утиліту командного рядка) зустрічається досить часто. PowerShell пропонує для цього декілька різних способів, які ми і розглянемо далі в цій статті. Почнемо з самого простого ...

Прямий запуск

Найпростіший спосіб запустити виконуваний файл в PowerShell - це перейти в директорію з файлом і стартувати його безпосередньо.Для прикладу візьмемо простеньку програмку, що виводить вітання, і виконаємо її командою:

Set-Location "C: \ Program Files"
. \ Hello.exe



Зверніть увагу, що навіть перебуваючи в потрібному каталозі, потрібно вказувати відносний шлях до виконуваного файлу. Виняток становлять файли з директорій, перерахованих у змінній оточення (path).Наприклад різні вбудовані програми і утиліти (notepad, calc, ping і т.п.), що знаходяться в директорії Windows \ System32, можна запускати без вказівки шляху.



оператор &

Якщо необхідно вказати повний шлях до виконуваного файлу, то можна скористатися оператором & (оператор виклику).Він дозволяє виконати рядок тексту, зазначену в лапках, як єдину команду. Наприклад:

& 'C: \ Program Files \ Hello.exe'



Оскільки оператор & не аналізує передану команду, то він не може інтерпретувати її параметри. Тому додаткові параметри \ аргументи передаються також у вигляді тексту, в лапках.Для прикладу візьмемо попередню програму і трохи змінимо її, так що вона приймає потрібний текст у вигляді аргументу:

& 'C: \ Program Files \ Hello.exe' 'Hello, world'

При бажанні можна вказати кількох аргументів через кому:

& 'C: \ Program Files \ Hello.exe' 'Hello,', 'world'

Для зручності команду і аргументи можна помістити в змінні:

$ exe = 'C: \ Program Files \ Hello.exe '
$ arg1 =' Hello '
$ arg2 =' world '
& $ exe $ arg1 $ arg2



Ну і якщо аргументів багато, то їх можна об'єднати, скориставшись такою конструкцією:

$ exe = 'C: \ Program Files \ Hello.exe '
$ allargs = @ (' Hello, ',' world ')
& $ exe $ allargs



Invoke-Expression

командлети Invoke-Expression працює приблизно так-же, як і оператор & - бере текстовий рядок і виконує її у вигляді команди.Наприклад:

Invoke-Expression -Command 'C: \ Windows \ Hello.exe'

Однак у нього є один великий недолік, а саме - невміння працювати з пробілами. Наприклад, наступна команда викличе помилку:

Invoke-Expression -Command 'C: \ Program Files \ Hello.exe'

Ця особливість робить застосування командлет вкрай незручним.Хоча при необхідності подібних помилок можна уникнути за допомогою додаткових лапок, наприклад так:

Invoke-Expression -Command "C: \ 'Program Files' \ Hello.exe"



Start-Process

командлети Start-Process запускає вказаний файл у вигляді процесу, використовуючи метод Start .NET класу Process. Наприклад:

Start-Process -FilePath 'C: \ Program Files \ Hello.exe '

За замовчуванням процес виконується в окремому вікні, яке закривається після закінчення процесу. Змінити таку поведінку можна за допомогою параметрів, так наступна команда запуститься в поточному вікні:

Start-Process -FilePath 'C: \ Program Files \ Hello.exe' -NoNewWindow -Wait

також Start-Process дозволяє передати в процес додаткові аргументи:

Start-Process -FilePath 'C: \ Program Files \ Hello.exe '-ArgumentList' Hello, world '-NoNewWindow -Wait



За замовчуванням командлет нічого не повертає, але за допомогою параметра -PassThru можна змусити його повернути об'єкт процесу. Цей об'єкт дуже зручно помістити в змінну:

$ process = Start-Process -FilePath 'C: \ Program Files \ Hello.exe' -Wait -PassThru

з якої можна потім можна дізнатися багато корисних речей, такі як статус:

$ process.HasExited

час:

$ process.ExitTime

або код виконання:

$ process.ExitCode



.NET

В принципі .NET класом Process можна скористатися безпосередньо, без командлет Start-Process. Наприклад, запустити процес можна командою:

[System.Diagnostics.Process] :: Start ( 'C: \ Program Files \ Hello.exe')



Такий спосіб досить незручний і громіздкий (на мій погляд), але трохи більш гнучкий у використанні.Для прикладу запустимо нашу програму в поточному вікні, передамо в неї аргументи і заберемо результат виконання:

$ process = New-Object -TypeName System.Diagnostics.Process
$ process.StartInfo.FileName = " C: \ Program Files \ Hello.exe "
$ process.StartInfo.Arguments =" Hello, world "
$ process.StartInfo.RedirectStandardOutput = $ true
$ process.StartInfo.UseShellExecute = $ false
$ process.Start ()
$ process.WaitForExit ()
$ process.StandatdOutput.ReadToEnd ()



WMI

За допомогою WMI можна зробити практично все, в тому числі і запустити програму. Для цього цілком підійде метод Create WMI-класу Win32_Process. Цей метод запускає процес на локальному або віддаленому комп'ютері через RPC. Наприклад, для виконання програми на локальному комп'ютері можна скористатися такою командою:

([wmiclass]) "Win32_Process").Create ( 'C: \ Program Files \ Hello.exe')

А для виконання на віддаленому комп'ютері команда буде виглядати так:

([wmiclass]) "\\ remotecomputer \ root \ cimv2: Win32_Process "). Create ( 'C: \ Program Files \ Hello.exe')



Як варіант, можна скористатися командлети Invoke-WmiMethod:

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "C: \ Program Files \ Hello.exe "



Або Командлети Invoke-CimMethod:

Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @ {CommandLine = "C: \ Program Files \ Hello.exe"}



WMI запускає процес в окремому вікні і повертає об'єкт, що містить ідентифікатор процесу (ProcessID) і результат виконання (ReturnValue). ReturnValue може набувати таких значень:

0 - Sucsessful Completiom
2 - Access Denied
3 - Insufficient Privilege
8 - Uncnown Failure
9 - Path Not Found
21 - Invalid Parameter

Invoke-Command

командлети Invoke-Command вміє виконувати команди на локальному або віддаленому комп'ютері, використовуючи WinRM.Наприклад, для запуску нашої програми на локальному комп'ютері використовуємо команду:

Invoke-Command -ScriptBlock { "C: \ 'Program Files' \ Hello.exe"}

При необхідності в програму можна передати аргументи:

Invoke-Command -ScriptBlock {C: \ 'Program Files' \ Hello.exe "Hello, world"}

Зверніть увагу, що Invoke-Command не надто дружить з пробілами, тому в уникненні помилок доводиться примудрялися з лапками.Втім, подібних проблем можна уникнути, наприклад комбінуючи використання командлет з оператором &:

Invoke-Command -ScriptBlock {& 'C: \ Program Files \ Hello.exe'}



В основному Invoke-Command застосовується для віддаленого управління, його головна перевага - це можливість одночасного виконання на кількох комп'ютерах.Наприклад:

Invoke-Command -ScriptBlock { "C: \ 'Program Files' \ Hello.exe"} -ComputerName SRV1, SRV2, SRV3

Або так:

$ scriptblock = { "C: \ 'Program Files' \ Hello.exe"}
$ Computers = @ ( 'SRV1', 'SRV2', 'SRV3')
Invoke-Command -ScriptBlock $ scriptblock -ComputerName $ Computers

За замовчуванням командлет повертає результат виконання програми, а якщо запустити його в фоновому режимі (параметр -AsJob), то повертає об'єкт Job:

Invoke-Command -ScriptBlock {C: \ 'Program Files' \ Hello.exe} -ComputerName localhost -AsJob -JobName Hello



Invoke-Item

Командлети Invoke-Item призначений для застосування до файлу дії за умовчанням. Так запустити виконуваний файл можна командою:

Invoke-Item -Path "C: \ Program Files \ Hello.exe"

Однак найбільш зручно використовувати Invoke-Item для відкриття певного типу файлів.Наприклад так ми відкриємо текстовий файл:

Invoke-Item -Path "C: \ Files \ test.txt"

А так все текстові файли в папці:

Invoke-Item -Path "C: \ Files \ *. txt"



CMD

Ну і на завершення ще один спосіб запуску програми з PowerShell - за допомогою оболонки cmd. Спосіб досить "непрямий", але тим не менше працює.Наступна команда запускає новий екземпляр cmd, виконує в ньому зазначену програму, завершує роботу cmd і повертає результат:

cmd/c "C: \ Program Files \ Hello.exe"



Таке ось достаток способів запустити програму надає PoSh. І кожен з них хороший для певних ситуацій.

До речі, стаття написана за мотивами PowerShell: Deep Dive and Best Practice. Рекомендую почитати, там ще багато цікавого.

.