设置PowerShell脚本自动执行

21

我有几行PowerShell代码,希望将其用作自动化脚本。我希望能够通过以下一种方式调用它:

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

我已经查阅了PowerShell文档,虽然可以找到很多脚本,但无法找到如何实现我需要的功能的说明。谢谢帮助。

5个回答

22

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注释技巧中的双@。

@@:: 这个序言允许将PowerShell脚本嵌入到.CMD文件中。
@@:: 任何非PowerShell内容都必须在"@@"之前。
@@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

不得不点赞这个创意。 很遗憾微软看不出这个的必要性。 - bigendian
3
我添加了“-ExecutionPolicy Bypass”参数。我想在这一行运行时,脚本已经在执行,所以你必须信任PowerShell部分与CMD部分一样。 - Jay Bazuzi
如果 %~f0 包含方括号,您可能需要考虑将 Get-Content '%~f0' 更改为 Get-Content -LiteralPath '%~f0' - Nick
不幸的是,这似乎不再起作用了,输出了许多错误。原始博客文章的链接也已经失效了。嗯,Windows 不是 Unix... - mivk
1
Windows确实不是Unix。上述两个多语言编程工具在我的电脑上都运行良好。这篇博客文章已经有15年的历史了,而我也离开公司已经有一段时间了。幸运的是,互联网档案馆还存在。https://web.archive.org/web/20150416121422/http://blogs.msdn.com/b/jaybaz_ms/archive/2007/04/26/powershell-polyglot.aspx - Jay Bazuzi

9

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

powershell.exe .\foo.ps1

请确保您指定了脚本的完整路径,并且将执行策略级别设置为至少“RemoteSigned”,以便可以运行未签名的本地脚本。


6

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

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

PowerShell C:\Path\To\YourPowerShellScript.ps1

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

PowerShell .\YourPowerShellScript.ps1

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


手动运行脚本方法1

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

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

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

这将允许您只需双击批处理文件即可运行PowerShell脚本,避免您必须更改PowerShell Execution Policy。

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


手动运行脚本方法2

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

还有一个额外的注册表设置,您需要修改它,以便可以运行包含空格的文件路径中的脚本。我在这篇博客文章中展示了如何做这两件事。

但是,使用此方法,您首先需要设置执行策略以允许运行脚本。您只需要在PowerShell命令提示符中运行此行一次即可完成。

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

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


3
我可以通过创建一个批处理文件并在其中添加以下内容来双击运行它:

这里是Matt的答案来源。

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

链接已经失效,所以这行代码没有任何有用的内容。有什么想法? - Wolf

0

你可以使用以下命令: powershell.exe -argument c:\scriptPath\Script.ps1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接