构建后事件执行 PowerShell

Posted

技术标签:

【中文标题】构建后事件执行 PowerShell【英文标题】:Post build event execute PowerShell 【发布时间】:2011-09-23 22:14:00 【问题描述】:

是否可以使用构建后事件设置 .NET 项目来执行 powershell 脚本?我正在使用这个脚本来生成一些文件。

我还可以将它是调试版本还是发布版本传递给脚本。一个很好的例子。

【问题讨论】:

我没有示例,但这里有一些您可能会觉得有用的链接:-***.com/q/813003/402706-***.com/q/5006619/402706-Re: Running PowerShell from Post-Build event ignoring ExecutionPolicy-Creating Powershell pre-build and post-build events for Visual Studio projects 【参考方案1】:

命令 Set-ExecutePolicy 将临时设置当前会话下的执行策略。如果你在 powershell 中设置它并在 vs 中运行 post build 命令,你仍然会被禁止。所以先设置然后像下面这样运行你的 ps1 脚本

powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath)

【讨论】:

【参考方案2】:

在从 Visual Studio 调用 power-shell 脚本之前,像这样从 power-shell 窗口将 ExecutionPolicy 设置为 RemoteSigned...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

然后按以下方式调用powershell脚本...

(无需传递完整的“powershell.exe”文件路径)

powershell.exe $(SolutionDir)Setup.ps1 -SolutionDir $(SolutionDir) -ProjectPath $(ProjectPath)

那么在脚本中,你总是可以这样读取参数...

param([string]$SolutionDir,
     [string]$ProjectPath);
#Write-Host ($SolutionDir +" Call this script with following aruments");
#Write-Host ($ProjectPath +" Call this script with following aruments");

【讨论】:

【参考方案3】:

我在构建后的偶数命令中使用以下命令:

PowerShell -NoProfile -ExecutionPolicy unrestricted -file $(SolutionDir)AutomationScript\DBAutomationScript.ps1 -target $(SolutionDir)MUFG.SECMOD.Data\SqlScripts -generatedFileName $(SolutionDir)MUFG.SECMOD.Data\SqlScripts\DeploymentDBScript.sql

DBAutomationScript.ps1 内容:

param ([string]$target, [string]$generatedFileName)

【讨论】:

【参考方案4】:

不必弄乱系统范围的设置并不得不区分 32 位和 64 位环境,一个更简单、更可靠的方法是在对 PowerShell 的调用中指定 ExecutionPolicy,如下:

C:\Users\xyz>PowerShell -ExecutionPolicy Unrestricted

PS C:\Users\xyz> Get-ExecutionPolicy
Unrestricted

PS C:\Users\xyz> exit

C:\Users\xyz>PowerShell -ExecutionPolicy RemoteSigned

PS C:\Users\xyz> Get-ExecutionPolicy
RemoteSigned

请注意在上面的代码中调用Get-ExecutionPolicy 是如何告诉你当前模式的。另请注意如何在对 PowerShell 本身的调用中指定此模式,它可以与脚本文件名结合使用:

test.ps1 内容:

echo ('The current policy is ' + (Get-ExecutionPolicy)).ToString()

在禁用脚本的系统上使用 Unrestricted 策略调用 test.ps1:

C:\Users\xyz>PowerShell -ExecutionPolicy Unrestricted -file test.ps1
The current policy is Unrestricted

另请注意,上述调用确实不需要需要管理员权限,因此可以在 Visual Studio 的 Pre-Build Step 或类似步骤中调用。

【讨论】:

【参考方案5】:

这是一个例子:

首先:您必须意识到必须配置 PowerShell 才能执行脚本。以下行允许 PowerShell 执行脚本:

Set-ExecutionPolicy RemoteSigned

此处特别提及:如果您运行的是 64 位系统,则必须注意 'devenv.exe' Visual Studio 2010 可执行文件是一个 32Bits 的 exe,所以你需要允许 PowerShell 32 执行脚本。

在这里,您可以进入您的项目属性并配置后期构建,如下所示(对不起,法语):

例如:

这里是文件'psbuild.ps1',它在目标路径中创建一个'test.txt',里面有配置名称。我评论了不同的方式来调试你的 postbuild 脚本(消息框、声音、输出消息)

param ([string]$config, [string]$target)

#[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
#[void][System.Windows.Forms.MessageBox]::Show("It works.")
#[Console]::Beep(600, 800)
#Write-Host 'coucou'
set-content $target -Value $config -Force

【讨论】:

好答案。我只想补充一点,您不应将执行策略设置为不受限制,而应设置为远程签名。 Unrestricted 允许任何脚本执行,而 remotesigned 要求下载的脚本使用受信任的密钥进行签名。 嗯,您是否测试在 Fat32 驱动器上下载 .PS1 文件或使用基本的 cmdline FTP 下载带有“远程签名”的 .PS1 文件?这不就是一种“烟雾缭绕的安全”吗? +1 特别提及 64 位系统 - 我快疯了,直到我读到我还需要允许在 32 位 PowerShell 中执行。谢谢! 如果路径使用:c:\windows\sysnative\windowspowershell\v1.0\powershell.exe,将调用64位版本的powershell。 %systemroot%\sysnative 是一个特殊的别名,告诉重定向器停止重定向,并允许真正访问 %systemroot%\system32。 @Peter Oehlert - 应该注意 c:\windows\sysnative 仅适用于 32 位进程。从带有 64 位 MSBuild 的 64 位命令提示符构建时(可能是构建服务器的情况),该别名将不存在。

以上是关于构建后事件执行 PowerShell的主要内容,如果未能解决你的问题,请参考以下文章

VS 构建后事件

发布发布事件

使用项目默认预构建事件执行预构建事件

如何仅为调试构建运行 Visual Studio 构建后事件

第二章 运行时的页面构建过程

使构建前和构建后的事件脚本漂亮吗?