为自动执行设置 PowerShell 脚本

Posted

技术标签:

【中文标题】为自动执行设置 PowerShell 脚本【英文标题】:Set up PowerShell Script for Automatic Execution 【发布时间】:2010-09-06 23:26:37 【问题描述】:

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

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

我一直在在线浏览 PowerShell 文档,虽然我可以找到很多脚本,但我一直无法找到有关如何执行我需要的操作的说明。感谢您的帮助。

【问题讨论】:

【参考方案1】:

来自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

如果您需要支持带引号的参数,还有更长的版本,它也允许 cmets。 (注意不寻常的 CMD 注释双 @ 技巧)。

@@:: 此序言允许将 PowerShell 脚本嵌入到 .CMD 文件中。 @@:: 任何非 PowerShell 内容必须以“@@”开头 @@setlocal @@set POWERSHELL_BAT_ARGS=%* @@如果定义了 POWERSHELL_BAT_ARGS 设置 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

【讨论】:

必须 +1 才能获得创造力。太糟糕了,微软认为不需要这个。 我修改为添加-ExecutionPolicy Bypass。我认为当该行运行时,脚本已经在执行,因此您必须像信任 CMD 部分一样信任 PowerShell 部分。 如果%~f0 包含方括号,您可以考虑将Get-Content '%~f0' 更改为Get-Content -LiteralPath '%~f0'【参考方案2】:

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

powershell.exe .\foo.ps1

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

【讨论】:

【参考方案3】:

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

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

PowerShell C:\Path\To\YourPowerShellScript.ps1

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

PowerShell .\YourPowerShellScript.ps1

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


手动运行脚本方法一

您可以see my blog post for more information,但本质上是创建您的 PowerShell .ps1 脚本文件来执行您想要的操作,然后在同一目录中创建一个 .cmd 批处理文件,并将以下内容用于文件内容:

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

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

这将允许您简单地双击批处理文件来运行您的 PowerShell 脚本,并且将避免您必须更改您的 PowerShell 执行策略。

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


手动运行脚本方法二

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

您需要修改一个额外的注册表设置,以便您可以运行文件路径包含空格的脚本。我展示了如何做这两件事on this blog post。

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

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

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

【讨论】:

【参考方案4】:

Source 马特的回答。

我可以通过双击一个文件来运行它,方法是创建一个包含以下内容的批处理文件:

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

【讨论】:

链接已失效,因此该行没有添加任何有用的内容。有什么想法吗?【参考方案5】:

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

【讨论】:

以上是关于为自动执行设置 PowerShell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

powershell 将执行策略远程签名设置为信任powershell脚本

如何在 Powershell 中自动执行 Telnet 端口检查?

如何设置PowerShell脚本定时执行

PowerShell 批量执行所有主机通过脚本安装软件

PowerShell 批量执行所有主机通过脚本安装软件

利用Powershell 脚本和定时任务自动批量开邮箱