我有一个自定义的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
答案 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)'}"