生成后事件执行PowerShell


85

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

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


Answers:


118

这是一个例子:

首先:您必须意识到必须将PowerShell配置为执行脚本这一事实。以下行允许PowerShell执行脚本:

Set-ExecutionPolicy RemoteSigned

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

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

在VS 2010中进行后期制作

例如 :

使用Powershell的Postbuild示例

这是文件“ 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

8
好答案。我只补充说,您不应将执行策略设置为不受限制,而应设置为remotesigned。Unrestricted允许执行任何脚本,而remotesigned要求使用可信密钥对下载的脚本进行签名。
Beegarino

2
您是否测试过在Fat32驱动器上下载.PS1文件或使用基本cmdline FTP下载带有“远程签名”的.PS1文件?这不是一种“烟熏式安全性”吗?
JPBlanc 2011年

3
+1是对64位系统的特别提及-我一直在发疯,直到我读到我还需要允许在32位PowerShell中执行。谢谢!
格维兹^ h


7
如果您使用:c:\ windows \ sysnative \ windowspowershell \ v1.0 \ powershell.exe作为路径,则将调用64位版本的powershell。%systemroot%\ sysnative是一个特殊的别名,用于告诉重定向器停止重定向,并允许对%systemroot%\ system32的实际访问。
Peter Oehlert 2014年

15

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

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

11

不必弄乱系统范围的设置并不必在32位和64位环境之间进行区分,而是一种更简单,更可靠的方法是ExecutionPolicy在对PowerShell的调用中指定,如下所示:

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的预生成步骤或类似的调用。


9

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

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");

6

我在构建后的even命令中使用以下命令进行了操作:

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.