首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerShell:使用PS 5类时找不到类型

PowerShell:使用PS 5类时找不到类型
EN

Stack Overflow用户
提问于 2017-03-16 14:49:55
回答 3查看 16.7K关注 0票数 16

我在PS中使用WinSCP PowerShell程序集中的类。在其中一种方法中,我使用来自WinSCP的各种类型。

只要我已经添加了程序集,它就能正常工作--但是,由于PowerShell在使用类时读取脚本的方式(我假设?),在加载程序集之前会抛出一个错误。

事实上,即使我把一个Write-Host放在顶部,它也不会加载。

在解析文件的其余部分之前,是否有任何方法强制某些东西运行?

代码语言:javascript
复制
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
        }

结果会出现这样的错误:

代码语言:javascript
复制
Protocol = [WinSCP.Protocol]::$ConnectionType
Unable to find type [WinSCP.Protocol].

但是我在哪里加载程序集并不重要。即使我将Add-Type cmdlet放在WinSCPnet.dll的最顶层行上,它也不会加载--它似乎会在运行任何东西之前检测缺少的类型。

EN

回答 3

Stack Overflow用户

发布于 2021-06-08 04:49:17

另一种解决方案是将add逻辑放入单独的.ps1文件(命名为AssemblyBootStrap.ps1或其他什么),然后将其添加到模块清单的ScriptsToProcess部分。ScriptsToProcess在根脚本模块(*.psm1)之前运行,在类定义查找它们时,程序集将被加载。

票数 2
EN

Stack Overflow用户

发布于 2017-03-16 15:22:28

虽然这本身并不是解决方案,但我还是解决了这个问题。然而,我将把这个问题留到现在。

而不是使用WinSCP类型,我只是使用字符串。因为我已经有了与WinSCP.Protocol相同的枚举

代码语言:javascript
复制
Enum Protocols {
    Sftp
    Ftp
    Ftps
}

并在FtpSettings中设置了协议

代码语言:javascript
复制
$FtpSettings.Protocol = [Protocols]::Sftp

我可以像这样设置协议

代码语言:javascript
复制
$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上使用了类似的

代码语言:javascript
复制
$TransferOptions.TransferMode = "Binary" #[WinSCP.TransferMode]::Binary
票数 1
EN

Stack Overflow用户

发布于 2019-11-12 16:59:38

首先,我推荐mclement0的答案。

然而,有一些你可以做的运行,以获得更多相同的效果,只要稍微少一点的工作,这可能有助于较小的项目或在早期阶段。

有可能只是。在代码中源另一个ps1文件,该文件包含在加载引用程序集后引用尚未加载的库的类。

代码语言:javascript
复制
##########
MyClasses.ps1

Class myClass
{
     [3rdParty.Fancy.Object] $MyFancyObject
}

然后,您可以从主脚本调用自定义类库。

代码语言:javascript
复制
#######
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

原始解析将通过集合,脚本将开始,您的引用将被添加,然后随着脚本的继续,。源文件将被读取和解析,添加您的自定义类而不会出现问题,因为在分析代码时,它们的引用库在内存中。

用正确的清单制作和使用模块仍然要好得多,但这样做很容易,而且非常容易记住和使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42837447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档