脚本在ISE中运行,但不在Powershell中运行
我有一本书。如果我在Powershell 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 -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