Запуск программы из PowerShell
Задача запустить из PowerShell какой либо исполняемый файл (программу или утилиту командной строки) встречается достаточно часто. PowerShell предлагает для этого несколько различных способов, которые мы и рассмотрим далее в этой статье. Начнем с самого простого…
Прямой запуск
Самый простой способ запустить исполняемый файл в PowerShell — это перейти в директорию с файлом и стартовать его напрямую. Для примера возьмем простенькую программку, выводящую приветствие, и выполним ее командой:
Set-Location ″C:\Program Files″
.\Hello.exe

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

Оператор &
Если необходимо указать полный путь к исполняемому файлу, то можно воспользоваться оператором & (оператор вызова). Он позволяет выполнить строку текста, указанную в кавычках, как единую команду. Например:
![]()
Поскольку оператор & не анализирует передаваемую команду, то он не может интерпретировать ее параметры. Поэтому дополнительные параметры\аргументы передаются также в виде текста, в кавычках. Для примера возьмем предыдущую программу и немного изменим ее, так что она принимает нужный текст в виде аргумента:
& ′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
из которой можно затем можно узнать многие полезные вещи, такие как статус:
или код выполнения:

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

Такой способ достаточно неудобен и громоздок (на мой взгляд), но чуть более гибок в использовании. Для примера запустим нашу программу в текущем окне, передадим в нее аргументы и заберем результат выполнения:
$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. Например, для выполнения программы на локальном компьютере можно воспользоваться такой командой:
А для выполнения на удаленном компьютере команда будет выглядеть так:

Как вариант, можно воспользоваться командлетом 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 @

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 не очень дружит с пробелами, поэтому во избежании ошибок приходится исхитряться с кавычками. Впрочем, подобных проблем можно избежать, например комбинируя использования командлета с оператором &:

В основном Invoke-Command применяется для удаленного управления, его главное достоинство — это возможность одновременного выполнения на нескольких компьютерах. Например:
Invoke-Command -ScriptBlock -ComputerName SRV1,SRV2,SRV3
$scriptblock =
$Computers = @(′SRV1′,′SRV2′,′SRV3′)
Invoke-Command -ScriptBlock $scriptblock -ComputerName $Computers
По умолчанию командлет возвращает результат выполнения программы, а если запустить его в фоновом режиме (параметр -AsJob), то возвращает объект Job:
Invoke-Command -ScriptBlock -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. Рекомендую почитать, там еще много интересного.
Запуск скриптов PowerShell
PowerShell — это новая командная оболочка для Windows, которая по задумкам Microsoft должна вытеснить и заменить cmd. По-умолчанию, эта оболочка уже идет в составе Windows 7 и выше. Если у вас более старая операционная система или вы просто хотите скачать более свежую версию PowerShell, сделать это можно здесь: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
Как запустить скрипт PowerShell?
Есть несколько различных способов запуска скрипта, ниже приведены основные:
- Запустить оболочку PowerShell и в ней запустить скрипт (ввести путь до файла и имя файла, например, так: C:\Scripts\test.ps1, или перейти в папку скрипта командой cd C:\Scripts и запустить его командой .\test.ps1) Оболочку можно найти и запустить множеством способов. Один из способов — через меню «Пуск». Для Windows 7 — нужно зайти во «Все программы» — «Стандартные» — «Windows PowerShell» и запустить оболочку «Windows PowerShell». Для Windows 10 — нужно найти группу на букву «W» и в ней вы найдете «Windows PowerShell».
- Запустить «Интегрированную среду сценариев Windows PowerShell ISE» — это программа — среда разработки, позволяющая редактировать и отлаживать скрипты PowerShell, которая так же есть по-умолчанию вместе с самим PowerShell. Запустив ее, нужно просто нажать кнопку «Открыть» или зайти в меню Файл — Открыть и выбрать нужный скрипт, затем нажать F5 или кнопку «Выполнить скрипт».Найти Windows PowerShell ISE можно там же, где и оболочку PowerShell — в меню «Пуск».
- Запустить стандартную коммандную строку и в ней написать:
powershell -file (пример: powershell -file myscript.ps1)
Если вы раньше не запускали скрипты PowerShell, то скорее всего, вы получите сообщение: Не удается загрузить файл , так как выполнение скриптов запрещено для данной системы. Введите «get-help about_signing» для получения дополнительных сведений. Связано это с тем, что из соображений безопасности и недопущения случайного выполнения вредоносного кода, все скрипты должны быть подписаны цифровой подписью.
Как разрешить выполнение неподписанного скрипта PowerShell?
1. В оболочке PowerShell , перед тем как запускать скрипт, выполнить команду, разрешающую выполнение неподписанных скриптов для текущего сеанса оболочки:
Set-ExecutionPolicy RemoteSigned -Scope Process
2. При запуске из стандартной коммандной строки использовать параметр -executionpolicy, т.е. запускать скрипт так:
powershell -executionpolicy RemoteSigned -file
Оба способа устанавливают политику только для текущего сеанса, при этом, политика безопасности выполнения скриптов PowerShell, прописанная в реестре, не будет изменена и останется прежней. Если вы хотите поменять политику безопасности выполнения скриптов «на постоянно», то используйте такой способ:
3. Разрешить запуск навсегда : запустить оболочку PowerShell от имени «Администратора», затем выполните команду:
Set-ExecutionPolicy RemoteSigned
Однако, я бы не рекомендовал такой способ, чтобы не подвергать ваш компьютер возможным угрозам, т.к. так вы разрешаете выполнение скриптов всем и всегда.
Примечание: Если скрипт был загружен из интернета, то чтобы избежать запроса на подтверждение запуска, нужно вместо RemoteSigned использовать Bypass — полное отключение любых запросов и предупреждений.
Как запустить скрипт PowerShell в фоновом режиме?
Для этого достаточно использовать параметр запуска -WindowStyle, который может принимать значения: Normal, Minimized, Maximized и Hidden. Таким образом, чтобы запустить неподписанный скрипт в фоновом режиме, нужно выполнить команду:
powershell -executionpolicy RemoteSigned -WindowStyle Hidden -file
Так же можно еще при желании добавить -NonInteractive, чтобы скрипт не задавал никаких вопросов. Таким образом, скрипт выполнится незаметно для пользователя. Будmте внимательны, используя такой способ.
Запуск скрипта PowerShell c параметрами
Собственно запуск нужно делать как если бы вы запускали обычную программу или bat-файл с параметрами. Например, для запуска скрипта с параметрами из командной, можно написать такую команду:
powershell -executionpolicy RemoteSigned -file param1 param2 «еще один текстовый параметр»
В самом скрипте вы можете получить эти параметры так:
param ($var1, $var2, $var3) echo $var1, $var2, $var3
В интегрированной среде PowerShell ISE запустить скрипт с параметрами можно аналогично, используя область команд.
Как запустить скрипт PowerShell с помощью ярлыка?
Осуществить такую задачу можно двумя способами:
- Создать bat/cmd файл, в котором прописать команду для запуска скрипта (с параметрами вы ознакомились выше)
- Создать ярлык на PowerShell, который можно найти в папке c:\Windows\System32\WindowsPowerShell\v\ и в свойствах ярлыка в поле «Объект» дописать необходимые параметры.
Таким образом, например, чтобы запустить скрипт powershell при входе пользователя, можно просто создать ярлык, как описано во 2-м пункте и поместить его в автозагрузку. Так же, создание ярлыка одним из способов выше позволит легко запустить скрипт от имени администратора или от имени любого другого пользователя как обычную программу.
Скриптовый язык PowerShell — довольно мощный инструмент для решения различных задач, но его можно использовать не только для хороших вещей, но и во вред, поэтому, пользуйтесь им с умом 😉
Открываем файл и читаем его содержимое с Get-Content в Powershell

Для открытия файлов и чтения его содержимого используется команда Powershell Get-Content. В этой статье рассмотрим работу команды с открытием файла, построчным чтением, поиском по содержимому строки на примерах.
Навигация по посту
- Получение данных
- Полное и построчное чтение с поиском
- Разделение файла
- Подсчет количества строк
- Кодировки
Получение данных
Для открытия файла ‘C:\text.txt’ можно использовать следующую команду:
Get-Content -Path 'C:\Windows\System32\drivers\etc\hosts'
Если у вас множество файлов или вы не уверены в назывании, то вы можете использовать подстановку. Символы подстановок бывают следующих типов:
- ‘*’ — говорит об неизвестном количестве символов;
- [a,b] — говорит, что в этом месте может быть буква ‘a’ или ‘b’;
- ? — обозначает один неизвестный символ.
Каждый из символов выше можно применять вместе и неограниченное число раз, в любой части пути и имени.
В этом примере я открою сразу два файла: lmhosts и hosts:
Get-Content -Path 'C:\Windows\System32\drivers\etc\*st*'
Следующие примеры вернут аналогичный результат:
Get-Content -Path 'C:\Windows\System32\drivers\etc\[l,h]*ost*' Get-Content -Path 'C:\Windows\System32\drivers\etc\*h?st*'
Для похожей фильтрации есть следующие параметры, которые так же позволяют использовать символы подстановок:
- Include — в этом параметре мы добавляем шаблон, по которому будем включать файл;
- Exclude — с помощью этого параметра исключает файлы;
- Filter — исключает результаты.
Для каждого из этих параметров есть обязательно условие — использовать знак ‘*’ в конце пути.
Так мы вернем все файлы с расширением ‘.txt’:
Get-Content -Path 'C:\*' -Filter '*.txt'
В отличие от Filter, в Include и Exclude мы можем использовать несколько значений. В этом примере мы откроем файлы формата ‘.txt’ и ‘.ini’:
Get-Content -Path 'C:\*' -Include '*.txt','*.ini'
Полное и построчное чтение с поиском
По умолчанию, если мы будем передавать результат команды через конвейер Powershell вывод будет построчный. Это может составить проблему, так как при дополнительных условиях у нас будет возвращаться одна строка, а не весь текст:
Get-Content -Path 'C:\file*.txt' | Select-String -Pattern 'Line 8'
Что бы текст передавался полностью, а не построчно — используйте параметр Raw:
Get-Content -Path 'C:\file*.txt' -Raw | Select-String -Pattern 'Line 8'
Если вам вдруг понадобится выводить по 2 или более строк за раз, можно указать их количество через ReadCount:
Get-Content -Path 'C:\file*.txt' -ReadCount 2 | Select-String -Pattern 'Line 8'
Разделение файла
Файл выводится построчно из-за делиметра (разделителя), который по умолчанию равен ‘\n’ (идентификатор новой строки). Мы можем разделить файл иначе, например, использовав точку с запятой:
Get-Content -Path 'C:\delimiter.txt' -Delimiter ';'
То есть результат выше — это массив. В массивах Powershell мы можем получать содержимое по индексам. В следующем примере я просто уберу точку с запятой:
$content = Get-Content -Path 'C:\delimiter.txt' -Delimiter ';' # Выведем первый элемент $content[0] # Уберем разделитель во всех адресах foreach ($c in $content)

Подсчет количества строк
Построчный вывод с командой Powershell позволяет посчитать количество строк во всем файле. Для подсчета используется команда Measure-Object:
Get-Content -Path 'C:\file.txt' | measure
Если нужна только цифра, а не объект, можно сделать так:
(Get-Content -Path 'C:\file.txt' | measure).Count
Кодировки
В параметре -Encoding можно указать следующие кодировки:
- ASCII
- BigEndianUnicode
- BigEndianUTF32
- Byte
- Default
- OEM
- Unicode
- UTF7
- UTF8
- UTF32
Вам так же будет интересно:
Как искать файлы используя Powershell Get-ChildItem
Чтения файла под другим пользователем
В этом командлете не предусмотрена возможность открытия файла под другим пользователем. При любых попытках вы будете получать ошибки:
- Access to the path is denied
- The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again without specifying credentials.
Для обхода этих ошибок, если у вас нет другого выхода, нужно использовать Invoke-Command (команда удаленного подключения). Для ее настройки могут потребоваться дополнительные настройки описанные в другой статье.
Сам процесс открытия файла под другим пользователем будет выглядеть так:
# Вводим свои учетные данные $creds = Get-Credential # Выполняем запрос под другим пользователем Invoke-Command -Computer localhost -Credential $creds -ScriptBlock
Непрерывное чтение
С помощью параметра Wait вы можете читать файл, который в этот момент обновляется системой или другим пользователем:
Get-Content -Path 'C:\file1.txt' -Wait
Ограничение вывода строк
Можно ограничить вывод содержимого файла указав количество нужных строк в начале или конце:
- Head — выведет указанное количество строк с начала;
- Tail — выведет указанное количество строк с конца.
Так будут выведены только первые 5 строк:
Get-Content -Path 'C:\file1.txt' -Head 5
Вам так же будет интересно:
Создание и изменение в Powershell NTFS разрешений ACL
Поиск файлов по содержимому
Get-Content не позволяет искать и открывать фалы находящиеся внутри других каталогов. Такой поиск называется рекурсивным и он доступен в Get-ChildItem.
В следующем примере мы вернем файлы из всех каталогов и подкаталогов:
Get-ChildItem -Path 'C:\Windows\' -Recurse -File
File — возвращает только файлы. Каталоги нам не нужны.
С Get-ChildItem вы так же можете использовать Include,Exclude и Filter, которые были рассмотрены раннее. Использовать эти ключи лучше всего в первой команде т.к. это будет работать быстрее.
Через конвейер мы сможем открыть каждый файл, а с Select-Sting проверить есть ли в нем нужный текст. Так мы найдем файл с Powershell, который содержит строку ‘127.0.0.1’ в папке Windows:
Get-ChildItem -Path 'C:\Windows\System32\drivers\etc\' -Recurse -File | Get-Content -Raw | Select-String '127.0.0.1'
Если убрать параметр Raw, то у нас выведется только та строка, которую мы искали:

Изменение файла с последующей записью
Вы так же можете изменить содержимое файла и перезаписать этот файл. Представим, что вам нужно заменить адрес ‘127.0.0.1’ в строке — это можно сделать так:
'My address: 127.0.0.1/24' -replace '127.0.0.1','192.168.3.2'
Или с помощью регулярного выражения (не точный шаблон):
'My address: 127.0.0.1/24' -replace '\d\.\d\.\d\.\d','192.168.3.2'
Для записи в файл у нас есть два варианта. Первый — это использовать перенаправление в виде знака ‘>’, который перезапишет все содержимое файла или создаст новый файл:
$file_content = Get-Content -Path 'C:\file1.txt' $file_content -replace '127.0.0.1','192.168.3.2' > file1.txt
Второй вариант — использовать команду Set-Content:
$file_content = Get-Content -Path 'C:\file1.txt' $file_content -replace '127.0.0.1','192.168.3.2' | Set-Content -Path 'C:\file1.txt'
Вам так же будет интересно:
Функции по работе со строками в Powershell
Подсчет четных чисел в файле
У меня есть файл ‘file.txt’ со следующим содержанием:
some text 123 some text 6 some text 9 some text 312345 123.2Шаблон регулярного выражения ‘\d*\.?\d*’ говорит, что мы ищем число, после которого может быть точка, после которого могут быть еще числа. Таким образом мы захватим целые и числа с плавающей точкой.
Для выделения таких чисел из строк нужно использовать Select-String:
$file = Get-Content -Path 'file.txt' $result = Select-String -InputObject $file -Pattern '\d*\.?\d*' -AllMatches | Foreach

Нам нужно отформатировать вывод убрав пустые строки и получить значения свойства Value:
$result | where Value -ne '' | select Value
Мы можем вернуть остаток от деления использовав %. Если число делится на 2 с остатком 0, то оно будет четным:
# Открываем файл $opened_file = Get-Content -Path 'file.txt' # Поиск чисел $result = Select-String -InputObject $opened_file -Pattern '\d*\.?\d*' -AllMatches | Foreach # Исключение пустых строк в выводе $result = ($result | where Value -ne '').Value foreach ($num in $result) < # Результат деления $n = $num%2 if ($n -eq 0)else >Как открыть файл с помощью командной строки и PowerShell
Хотите открыть файл из командной строки? Вот как вы можете открыть файл с помощью командной строки или PowerShell, выполнив простые действия.
Чтобы открыть файл в Windows, все, что вам нужно сделать, это дважды щелкнуть по нему мышью. Кроме того, вы также можете выбрать его и нажать клавишу Enter на клавиатуре. Пока есть совместимая программа, файл открывается практически сразу. В подавляющем большинстве ситуаций достаточно открыть такой файл. Однако будут моменты, когда вы можете открыть файл с помощью инструментов командной строки, таких как Command Prompt или PowerShell .
Может быть любое количество ситуаций, когда вам нужно открывать файлы с помощью командной строки. Например, если вы хотите запустить программу со специальными флагами, вам обычно нужно запускать ее с помощью командной строки или создать ярлык на рабочем столе со специальными флагами. Фактически, вы даже можете создавать командные файлы и запускать их для открытия файлов с помощью других программ, таких как планировщик задач.
Независимо от причины, если вам когда-нибудь понадобится открыть файл с помощью командной строки или PowerShell выполните действия, указанные ниже. Перечисленные ниже шаги будут работать во всех версиях Windows.
Связано: Как создать файл с помощью командной строки или PowerShell
- Командная строка
- PowerShell
Открыть файл с помощью командной строки
Чтобы открыть файл с помощью командной строки в Windows, выполните следующие действия.
1. Откройте окно командной строки . В Windows это можно сделать, выполнив поиск «cmd» в меню «Пуск» или выполнив команду «Выполнить cmd».

2. В окне командной строки выполните следующую команду, чтобы перейти в папку , где находится файл, который вы хотите открыть.
cd » путь к папке «
3. Затем введите имя файла вместе с его расширением и нажмите Enter . Например, если вы хотите открыть файл JPEG, вы должны ввести «image.jpeg».
Примечание. Если в имени файла есть пробелы, введите его в кавычки (например: «мое изображение .jpeg »).
4. Чтобы открыть файл в командной строке с помощью определенной программы , используйте следующую команду.
» путь к программе.exe «» путь к файлу «
Если программа добавлена в путь Windows, вам не нужно вводить полный путь к программе. Вы можете просто ввести его следующим образом:
program.exe «путь к файлу»
Открыть файл с помощью PowerShell
Чтобы открыть файл с помощью PowerShell, выполните следующие действия.
1. Откройте окно PowerShell . Вы можете сделать это в Windows, выполнив поиск в меню «Пуск». Либо щелкните правой кнопкой мыши меню «Пуск» и выберите параметр «Windows PowerShell».

2. Используйте команду ниже, чтобы перейти в папку , где находится файл, который вы хотите открыть. В этом шаге нет необходимости, но если вы этого не сделаете, вам придется вручную ввести полный путь к файлу, а не только имя файла.
cd «C: path в папку «
3. Когда вы окажетесь в папке, выполните следующую команду, чтобы открыть файл с помощью PowerShell . Замените фиктивное имя файла фактическим именем файла и его расширением. Пока существует совместимая программа, файл будет открыт.
4. Чтобы открыть файл с помощью определенной программы , выполните команду ниже . Не забудьте заменить фиктивные пути фактическими путями к программе и файлам.
«C: path to program.exe» «D: path to file.png»
Важное примечание: для открытия некоторых файлов могут потребоваться права администратора. В этом случае откройте инструмент командной строки как администратор, а затем откройте файл оттуда.
Вот и все. Так просто открывать файлы с помощью командной строки или PowerShell.
Надеюсь, это поможет. Если вы застряли или вам нужна помощь, прокомментируйте ниже, и я постараюсь помочь в максимально возможной степени.