Настройте PowerShell Script для автоматического выполнения

У меня есть несколько строк кода PowerShell, которые я хотел бы использовать в качестве автоматизированного script. Способ, которым я хочу, чтобы он мог работать, - это позвонить ему, используя один из следующих вариантов:

  • Одна командная строка, которая открывает PowerShell, выполняет script и закрывает PowerShell (это будет использоваться для глобальной строковой процедуры)
  • Файл, который я могу дважды щелкнуть, чтобы запустить выше (я бы использовал этот метод при ручном тестировании компонентов моего процесса сборки).

Я просматриваю документацию PowerShell онлайн, и хотя я могу найти множество сценариев, я не смог найти инструкции о том, как делать то, что мне нужно. Спасибо за помощь.

Ответы

Ответ 1

Сохраните script как файл .ps1 и запустите его с помощью файла powershell.exe, например:

powershell.exe .\foo.ps1

Убедитесь, что вы указали полный путь к script и убедитесь, что вы установили уровень политики выполнения как минимум на "RemoteSigned", чтобы можно было запускать скрипты без знака.

Ответ 2

От http://blogs.msdn.com/b/jaybaz_ms/archive/2007/04/26/powershell-polyglot.aspx

Если вы готовы выложить свою красивую PowerShell script с помощью небольшого CMD, вы можете использовать трюк Polyglot PowerShell-CMD. Сохраните PowerShell script как .CMD файл и поместите эту строку вверху:

@PowerShell -ExecutionPolicy Bypass -Command Invoke-Expression $('[email protected](^&{$args} %*);'+[String]::Join(';',(Get-Content '%~f0') -notmatch '^^@PowerShell.*EOF$')) & goto :EOF

Если вам нужно поддерживать цитируемые аргументы, существует более длинная версия, которая также позволяет комментировать. (обратите внимание на необычный трюк компиляции CMD double @).

@@:: This prolog allows a PowerShell script to be embedded in a .CMD file.
@@:: Any non-PowerShell content must be preceeded by "@@"
@@setlocal
@@set POWERSHELL_BAT_ARGS=%*
@@if defined POWERSHELL_BAT_ARGS set POWERSHELL_BAT_ARGS=%POWERSHELL_BAT_ARGS:"=\"%
@@PowerShell -ExecutionPolicy Bypass -Command Invoke-Expression $('[email protected](^&{$args} %POWERSHELL_BAT_ARGS%);'+[String]::Join(';',$((Get-Content '%~f0') -notmatch '^^@@'))) & goto :EOF

Ответ 3

Источник для ответа Matt.

Я могу запустить его, дважды щелкнув файл, создав в нем пакетный файл со следующим:

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe LocationOfPS1File

Ответ 4

Выполнить Script автоматически из другого Script (например, пакетный файл)

Как предложил Мэтт Гамильтон, просто создайте PowerShell.ps1 Script и вызовите его, используя:

PowerShell C:\Path\To\YourPowerShellScript.ps1

или если рабочий каталог пакетного файла - это тот же каталог, в котором находится PowerShell Script, вы можете использовать относительный путь:

PowerShell .\YourPowerShellScript.ps1

И прежде чем это сработает, вам нужно будет установить политику выполнения ПК, которую я покажу, как это сделать ниже.


Выполнить Script Метод вручную 1

Вы можете посмотреть мое сообщение в блоге для получения дополнительной информации, но по существу создайте файл PowerShell.ps1 Script, чтобы делать то, что вы хотите, и затем создайте пакетный файл .cmd в том же каталоге и используйте следующее для содержимого файла:

@ECHO OFF
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%MyPowerShellScript.ps1
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%'"

Замена MyPowerShellScript.ps1 на третьей строке с именем файла вашего PowerShell script.

Это позволит вам просто дважды щелкнуть командный файл, чтобы запустить PowerShell script, и вам не придется менять политику выполнения PowerShell.

В моем сообщении в блоге также показано, как запустить PowerShell Script в качестве администратора, если это то, что вам нужно сделать.


Выполнить Script Метод вручную 2

В качестве альтернативы, если вы не хотите создавать пакетный файл для каждого из ваших сценариев PowerShell, вы можете изменить поведение PowerShell Script по умолчанию из "Правка" для запуска, что позволяет дважды щелкнуть ваши файлы .ps1 для запуска их.

Существует дополнительный параметр реестра, который вы хотите изменить, чтобы вы могли запускать скрипты, путь к файлу которых содержит пробелы. Я покажу, как делать обе эти вещи в этом сообщении в блоге.

С помощью этого метода, однако, сначала вам нужно установить политику выполнения, чтобы разрешить запуск сценариев. Вам нужно сделать это только один раз для ПК, и это можно сделать, выполнив эту строку в командной строке PowerShell.

Start-Process PowerShell -ArgumentList 'Set-ExecutionPolicy RemoteSigned -Force' -Verb RunAs

Set-ExecutionPolicy RemoteSigned -Force - это команда, которая фактически изменяет политику выполнения; это устанавливает его в RemoteSigned, поэтому вы можете изменить это на что-то еще, если вам нужно. Кроме того, эта строка автоматически запускает PowerShell в качестве администратора для вас, что требуется для изменения политики выполнения.

Ответ 5

вы можете использовать эту команду: powershell.exe -argument c:\scriptPath\ Script.ps1