构建后事件执行PowerShell

时间:2011-06-28 00:10:49

标签: c# .net powershell msbuild

是否可以使用post build事件设置.NET项目来执行powershell脚本?我正在使用此脚本生成一些文件。

我也可以通过它是脚本的调试版本还是发布版本。这方面的一个例子很棒。

5 个答案:

答案 0 :(得分:108)

以下是一个例子:

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

Set-ExecutionPolicy RemoteSigned

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

在这里,您可以进入项目属性并配置帖子构建,如下所示(抱歉用法语):

Post build in VS 2010

例如:

Example of postbuild with powershell

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:6)

在从visual studio调用power-shell脚本之前,将powercutionPolicy从power-shell窗口设置为POST /rest/myMethod HTTP/1.1 Host: example.com Content-Type: application/json Content-Length: 174 Connection: close { "Param1": "value of param1", "Param2": "2017-01-18T07:31:02Z", "Param3": "2017-01-19T07:31:02Z", "Param4": [ "foo", "bar" ], "Param5": [ "baz" ] } ,就像这样......

RemoteSigned

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

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

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

enter image description here

然后在脚本中,你总是可以读取像这样的参数......

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

答案 3 :(得分:5)

而不是搞乱系统范围的设置并且不得不区分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的预构建步骤或类似步骤中调用。

答案 4 :(得分:4)

我在构建后的偶数命令中使用以下命令完成了该操作:

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)