设置PowerShell脚本以执行自动执行

Yaa*_*lis 16 powershell scripting command-line

我有几行PowerShell代码,我想将其用作自动脚本.我希望它能够工作的方式是能够使用以下选项之一调用它:

  1. 一个打开PowerShell的命令行,执行脚本并关闭PowerShell(这将用于全局构建例程)
  2. 我可以双击以运行上面的文件(我会在手动测试构建过程的组件时使用此方法)

我一直在线阅读PowerShell文档,虽然我可以找到很多脚本,但我一直无法找到如何做我需要的说明.谢谢您的帮助.

Jay*_*uzi 16

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

如果你愿意用一点CMD来玷污你漂亮的PowerShell脚本,你可以使用PowerShell-CMD多语言技巧.将PowerShell脚本另存为.CMD文件,并将此行放在顶部:

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

如果你需要支持引用的参数,那么版本更长,也允许注释.(注意双@的不寻常的CMD评论技巧).

@@:: 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

  • 我修改为添加`-ExecutionPolicy Bypass`。我认为在该行运行时,脚本已经在执行,因此您必须像信任 CMD 部分一样信任 PowerShell 部分。 (2认同)

Mat*_*ton 8

将脚本保存为.ps1文件并使用powershell.exe启动它,如下所示:

powershell.exe .\foo.ps1
Run Code Online (Sandbox Code Playgroud)

确保指定脚本的完整路径,并确保已将执行策略级别设置为至少"RemoteSigned",以便可以运行未签名的本地脚本.


dea*_*dog 6

从另一个脚本自动运行脚本(例如批处理文件)

正如 Matt Hamilton 建议的那样,只需创建 PowerShell .ps1 脚本并使用以下命令调用它:

PowerShell C:\Path\To\YourPowerShellScript.ps1
Run Code Online (Sandbox Code Playgroud)

或者,如果批处理文件的工作目录与 PowerShell 脚本所在的目录相同,则可以使用相对路径:

PowerShell .\YourPowerShellScript.ps1
Run Code Online (Sandbox Code Playgroud)

在此之前,您需要设置 PC 的执行策略,我将在下面展示如何执行此操作。


手动运行脚本方法1

您可以查看我的博客文章以获取更多信息,但本质上是创建 PowerShell .ps1 脚本文件来执行您想要的操作,然后在同一目录中创建一个 .cmd 批处理文件,并使用以下内容作为文件内容:

@ECHO OFF
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%MyPowerShellScript.ps1
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%'"
Run Code Online (Sandbox Code Playgroud)

将第三行的MyPowerShellScript.ps1替换为 PowerShell 脚本的文件名。

这样您只需双击批处理文件即可运行 PowerShell 脚本,并且无需更改 PowerShell 执行策略。

我的博客文章还展示了如何以管理员身份运行 PowerShell 脚本(如果您需要这样做)。


手动运行脚本方法2

或者,如果您不想为每个 PowerShell 脚本创建批处理文件,则可以将默认 PowerShell 脚本行为从“编辑”更改为“运行”,从而允许您双击 .ps1 文件来运行它们。

您需要修改另一个注册表设置,以便可以运行文件路径包含空格的脚本。我在这篇博文中展示了如何完成这两件事。

但是,使用此方法,您首先需要设置执行策略以允许运行脚本。您只需在每台 PC 上执行一次此操作,并且可以通过在 PowerShell 命令提示符中运行此行来完成。

Start-Process PowerShell -ArgumentList 'Set-ExecutionPolicy RemoteSigned -Force' -Verb RunAs
Run Code Online (Sandbox Code Playgroud)

Set-ExecutionPolicy RemoteSigned -Force是实际更改执行策略的命令;这会将其设置为RemoteSigned,因此您可以根据需要将其更改为其他内容。此外,此行将自动以管理员身份运行 PowerShell,这是更改执行策略所必需的。