我在PS中使用WinSCP PowerShell程序集中的类。在其中一种方法中,我使用来自WinSCP的各种类型。
只要我已经添加了程序集,它就能正常工作--但是,由于PowerShell在使用类时读取脚本的方式(我假设?),在加载程序集之前会抛出一个错误。
事实上,即使我把一个Write-Host放在顶部,它也不会加载。
在解析文件的其余部分之前,是否有任何方法强制某些东西运行?
Transfer() {
$this.Logger = [Logger]::new()
try {
Add-Type -Path $this.Paths.WinSCP
$ConnectionType = $this.FtpSettings.Protocol.ToString()
$SessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::$ConnectionType
HostName = $this.FtpSettings.Server
UserName = $this.FtpSettings.Username
Password = $this.FtpSettings.Password
}结果会出现这样的错误:
Protocol = [WinSCP.Protocol]::$ConnectionType
Unable to find type [WinSCP.Protocol].但是我在哪里加载程序集并不重要。即使我将Add-Type cmdlet放在WinSCPnet.dll的最顶层行上,它也不会加载--它似乎会在运行任何东西之前检测缺少的类型。
发布于 2021-06-08 04:49:17
另一种解决方案是将add逻辑放入单独的.ps1文件(命名为AssemblyBootStrap.ps1或其他什么),然后将其添加到模块清单的ScriptsToProcess部分。ScriptsToProcess在根脚本模块(*.psm1)之前运行,在类定义查找它们时,程序集将被加载。
发布于 2017-03-16 15:22:28
虽然这本身并不是解决方案,但我还是解决了这个问题。然而,我将把这个问题留到现在。
而不是使用WinSCP类型,我只是使用字符串。因为我已经有了与WinSCP.Protocol相同的枚举
Enum Protocols {
Sftp
Ftp
Ftps
}并在FtpSettings中设置了协议
$FtpSettings.Protocol = [Protocols]::Sftp我可以像这样设置协议
$SessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = $this.FtpSettings.Protocol.ToString()
HostName = $this.FtpSettings.Server
UserName = $this.FtpSettings.Username
Password = $this.FtpSettings.Password
}我在WinSCP.TransferMode上使用了类似的
$TransferOptions.TransferMode = "Binary" #[WinSCP.TransferMode]::Binary发布于 2019-11-12 16:59:38
首先,我推荐mclement0的答案。
然而,有一些你可以做的运行,以获得更多相同的效果,只要稍微少一点的工作,这可能有助于较小的项目或在早期阶段。
有可能只是。在代码中源另一个ps1文件,该文件包含在加载引用程序集后引用尚未加载的库的类。
##########
MyClasses.ps1
Class myClass
{
[3rdParty.Fancy.Object] $MyFancyObject
}然后,您可以从主脚本调用自定义类库。
#######
MyMainScriptFile.ps1
#Load fancy object's library
Import-Module Fancy.Module #If it's in a module
Add-Type -Path "c:\Path\To\FancyLibrary.dll" #if it's in a dll you have to reference
. C:\Path\to\MyClasses.ps1原始解析将通过集合,脚本将开始,您的引用将被添加,然后随着脚本的继续,。源文件将被读取和解析,添加您的自定义类而不会出现问题,因为在分析代码时,它们的引用库在内存中。
用正确的清单制作和使用模块仍然要好得多,但这样做很容易,而且非常容易记住和使用。
https://stackoverflow.com/questions/42837447
复制相似问题