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

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

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

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

5 ответов


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

powershell.exe .\foo.ps1

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


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

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

@PowerShell -ExecutionPolicy Bypass -Command Invoke-Expression $('$args=@(^&{$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 $('$args=@(^&{$args} %POWERSHELL_BAT_ARGS%);'+[String]::Join(';',$((Get-Content '%~f0') -notmatch '^^@@'))) & goto :EOF

источник для ответа Мэтта.

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

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

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

как предложил Мэтт Гамильтон, просто создайте свой PowerShell .PS1 скрипт и вызовите его с помощью:

PowerShell C:\Path\To\YourPowerShellScript.ps1

или если рабочий каталог вашего пакетного файла является тем же каталогом, что и сценарий PowerShell, вы можете использовать относительный путь:

PowerShell .\YourPowerShellScript.ps1

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


Запустить Скрипт Вручную Методом 1

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

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

замена MyPowerShellScript.ps1 в 3-й строке с именем файла сценария PowerShell.

это позволит вы просто дважды щелкните пакетный файл для запуска сценария PowerShell и избежите необходимости изменять политику выполнения PowerShell.

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


Запустить Скрипт Вручную Методом 2

кроме того, если вы не хотите создавать пакетный файл для каждого скрипта PowerShell, вы можете изменить поведение скрипта PowerShell по умолчанию с Edit на Беги, позволяя дважды щелкните .файлы PS1, чтобы запустить их.

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

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

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

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


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