是否可以使用构建后事件设置.NET项目以执行Powershell脚本?我正在使用此脚本生成一些文件。
我还可以将它是调试版本还是发行版本传递给脚本。一个很好的例子。
Answers:
这是一个例子:
首先:您必须意识到必须将PowerShell配置为执行脚本这一事实。以下行允许PowerShell执行脚本:
Set-ExecutionPolicy RemoteSigned
在此特别提及:如果您运行的是64位系统,则必须注意Visual Studio 2010可执行文件'devenv.exe '是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
不必弄乱系统范围的设置并不必在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的预生成步骤或类似的调用。
在从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");
我在构建后的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)