Powershell脚本参数和依赖程序集

时间:2013-07-05 10:19:28

标签: powershell

我有一个自定义的PowerShell脚本,它接受一些参数作为输入。

但是,其中一个参数是在外部程序集中定义的类型。这意味着当我从PowerShell.exe的命令行运行脚本时,程序集未加载,脚本失败。

以下是该脚本的相关部分:

[CmdLetBinding()]
param(
    [Parameter(Mandatory=$true, Position=0)]
    [Microsoft.SharePoint.PowerShell.SPWebPipeBind]$Web
)

# The SharePoint snapin will load 'Microsoft.SharePoint.PowerShell'
Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0
Write-Host "Let's dance"

这里我是如何解雇脚本的(实际上来自SharePoint项目的部署后事件):

"%WINDIR%\SysNative\WindowsPowerShell\v1.0\powershell.exe" -file "c:\pathto\fixeditablefields.ps1" "http://myapp"

有没有办法告诉PowerShell.exe在运行脚本之前加载程序集?

[编辑] 由于我正在使用SharePoint,因此我坚持使用PowerShell V2

2 个答案:

答案 0 :(得分:1)

我说,不。您可以做的一件事是使用#Requires语句阻止脚本在程序集不存在时运行:

#Requires -PSSnapin Microsoft.SharePoint.PowerShell

如果您无法访问该脚本或无法以任何方式控制它,那么我建议您更改参数类型并在函数内添加验证。

答案 1 :(得分:0)

好的,我设法使这个工作。

我使用以下方式启动脚本:

"%WINDIR%\SysNative\WindowsPowerShell\v1.0\powershell.exe" -command "& {Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0; & 'c:\pathto\fixeditablefields.ps1' -Web 'http://myapp'}"

基本上,我不是直接运行我的脚本文件,而是运行一个脚本块,它包含运行两个命令:Add-PSSnapin,它加载我缺少的程序集,然后用& c:\pathto\script.ps1构造执行脚本。

对于未来的读者,我的PostDeployment事件恰好是:

"%WINDIR%\SysNative\WindowsPowerShell\v1.0\powershell.exe" -command "& {Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0; & '$(SolutionDir)fixeditablefields.ps1' -Web '$(SharePointSiteUrl)'}"