构建后事件执行 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的主要内容,如果未能解决你的问题,请参考以下文章