脚本在ISE中运行,但不在Powershell中运行

脚本在ISE中运行,但不在Powershell中运行,powershell,Powershell,我有一本书。如果我在Powershell ISE中打开该脚本,它运行得非常好,但是,如果我右键单击该文件并单击“使用Powershell运行”,脚本将抛出一个错误 此外,我在前面的线程中读到,以下执行模式解决了一些人的问题: powershell -STA -File script.ps1 在本例中,这并没有解决问题,但它确实允许我读取错误: At C:\Users\sancarn\AppData\Local\Temp\script.ps1:20 char:20 + $pare

我有一本书。如果我在Powershell ISE中打开该脚本,它运行得非常好,但是,如果我右键单击该文件并单击“使用Powershell运行”,脚本将抛出一个错误

此外,我在前面的线程中读到,以下执行模式解决了一些人的问题:

powershell -STA -File script.ps1
在本例中,这并没有解决问题,但它确实允许我读取错误:

At C:\Users\sancarn\AppData\Local\Temp\script.ps1:20 char:20
+         $parent = [System.Windows.Forms.TreeNode]$global:database.Ite ...
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unable to find type [System.Windows.Forms.TreeNode].
At C:\Users\sancarn\AppData\Local\Temp\script.ps1:27 char:36
+ ...          [void]$node.nodes.add([System.Windows.Forms.TreeNode]::new(" ...
+                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unable to find type [System.Windows.Forms.TreeNode].
At C:\Users\sancarn\AppData\Local\Temp\script.ps1:33 char:45
+ ... PSCustomObject]IWDBGetChildren([System.Windows.Forms.TreeNode]$node)  ...
+                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unable to find type [System.Windows.Forms.TreeNode].
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TypeNotFound
话虽如此,我不确定我真的能对这个错误做些什么。。。我已经加载了
System.Windows.Forms
System.Drawing
。。。有人知道如何正确执行此文件吗

编辑

尝试解决此问题的其他尝试:

powershell -NoExit -STA -File script.ps1
powershell -NoExit -STA -File script.ps1 -Scope Global
编辑2

我还尝试添加:

Add-Type -AssemblyName System.Windows.Forms
到powershell脚本的顶部。然而,这个问题仍未解决


编辑:

不确定为什么在之后将此标记为重复

  • 此答案已经有一个推荐答案,并且
  • 建议的答案说明了为什么这是不同的

  • 正如@PetSerAl在评论中所说,答案是

    在执行脚本中的第一条语句之前,会对每个PowerShell脚本进行完全解析。类定义中无法解析的类型名标记被视为解析错误。为了解决问题,必须在解析类定义之前加载类型,因此类定义必须位于单独的文件中

    最终要解决这个问题,我需要将我的类定义作为一个单独的文件加载,或者将我的声明存储在一个头文件中,该头文件调用类定义(以及脚本的其余部分)

    我很惊讶这甚至是一个问题,但它现在起作用了,所以这很好

    编辑 就我而言,这与解决方案作者链接的帖子有点不同。实际上,我正在构建一个ruby库,用于在windows机器上执行Powershell。目前,我不向文件写入数据,也不能保证here字符串/调用表达式能够工作

    Invoke-Expression @"
    $anotherString=@"
        hello world!
    "@    
    "@ <--- Powershell will throw an error here!
    
    调用表达式@”
    $anotherString=@”
    你好,世界!
    "@    
    
    “@
    Add Type-AssemblyName System.Windows.Forms
    Hi-peter,这与
    [void][System.Reflection.Assembly]:LoadWithPartialName(“System.Windows.Forms”)
    不一样吗?另外,我刚刚尝试了一下,一点帮助都没有。仍然收到相同的错误。可能重复的字符串不能在此处嵌套使用相同分隔符的字符串,但如果使用
    @'.''.@
    作为外部分隔符,则可以使用
    调用表达式
    命令。的确,这里的问题是ruby类被专门设计为允许任何人执行任何Powershell。。。我看不出有人是要使用
    @'…@
    还是
    @“…”
    。所以用户会在传递给
    调用表达式的here字符串中按字面意思键入代码?是的,非常字面意思。这是一个用于执行Powershell的Ruby库。因此,用户将是开发人员。脚本本身以前只是作为编码命令注入的。因此,是的,他们会在这里输入传递给Invoke-Expression.Note的字符串-您可以使用
    powershell.exe-encodedCommand…
    直接执行编码字符串:(当然要受行长限制)。有关信息,请参见“powershell.exe-?”。
    require 'base64'
    if header!=""
        encoded_body = Base64.strict_encode64(body.encode("utf-16le"))
        body = <<-END_TRANSFORMATION
            #{header}
    
            $encoded_body = "#{encoded_body}"
            Invoke-Expression $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($encoded_body)))
        END_TRANSFORMATION
    end