我有几行PowerShell代码,希望将其用作自动化脚本。我希望能够通过以下一种方式调用它:
- 一个命令行窗口,打开PowerShell,执行脚本并关闭PowerShell(这将用于全局构建过程)
- 一个文件,我可以双击运行上述操作(在手动测试构建流程组件时使用此方法)
我已经查阅了PowerShell文档,虽然可以找到很多脚本,但无法找到如何实现我需要的功能的说明。谢谢帮助。
我有几行PowerShell代码,希望将其用作自动化脚本。我希望能够通过以下一种方式调用它:
我已经查阅了PowerShell文档,虽然可以找到很多脚本,但无法找到如何实现我需要的功能的说明。谢谢帮助。
从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
将您的脚本保存为.ps1文件,并使用powershell.exe启动它,如下所示:
powershell.exe .\foo.ps1
请确保您指定了脚本的完整路径,并且将执行策略级别设置为至少“RemoteSigned”,以便可以运行未签名的本地脚本。
如Matt Hamilton所建议的那样,只需创建您的PowerShell .ps1脚本并使用以下命令调用它:
PowerShell C:\Path\To\YourPowerShellScript.ps1
如果您的批处理文件的工作目录与PowerShell脚本所在的目录相同,则可以使用相对路径:
PowerShell .\YourPowerShellScript.ps1
在此之前,您需要设置PC的执行策略,我将在下面展示如何进行设置。
您可以查看我的博客文章以获取更多信息,但基本上是创建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脚本,如果您需要的话。
或者,如果您不想为每个PowerShell脚本创建批处理文件,您可以将默认的PowerShell脚本行为从“编辑”改为“运行”,从而允许您双击运行.ps1文件。
还有一个额外的注册表设置,您需要修改它,以便可以运行包含空格的文件路径中的脚本。我在这篇博客文章中展示了如何做这两件事。
但是,使用此方法,您首先需要设置执行策略以允许运行脚本。您只需要在PowerShell命令提示符中运行此行一次即可完成。
Start-Process PowerShell -ArgumentList 'Set-ExecutionPolicy RemoteSigned -Force' -Verb RunAs
Set-ExecutionPolicy RemoteSigned -Force 是实际更改执行策略的命令;这将设置为 RemoteSigned,因此如果需要,您可以更改为其他内容。另外,此行将自动以管理员身份运行 PowerShell,这是更改执行策略所必需的。
这里是Matt的答案来源。
C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe LocationOfPS1File
你可以使用以下命令: powershell.exe -argument c:\scriptPath\Script.ps1
%~f0
包含方括号,您可能需要考虑将Get-Content '%~f0'
更改为Get-Content -LiteralPath '%~f0'
。 - Nick