脚本在ISE中工作,而不是在某些powershell CLI中工作

脚本在ISE中工作,而不是在某些powershell CLI中工作,powershell,Powershell,所以这个脚本在ISE中工作,如果我将它复制/粘贴到CLI中,就是这样。如果我导航到powershell CLI中的文件夹并从那里运行它,则会出现以下错误: 新对象:找不到类型 [System.Windows.Forms.FolderBrowserDialog]:验证程序集 已加载包含此类型的。在 C:\script\scripts\pathingworking.ps1:8字符:19 +$foldername=新建对象System.Windows.Forms.FolderBrowserDialog

所以这个脚本在ISE中工作,如果我将它复制/粘贴到CLI中,就是这样。如果我导航到powershell CLI中的文件夹并从那里运行它,则会出现以下错误:

新对象:找不到类型 [System.Windows.Forms.FolderBrowserDialog]:验证程序集 已加载包含此类型的。在 C:\script\scripts\pathingworking.ps1:8字符:19 +$foldername=新建对象System.Windows.Forms.FolderBrowserDialog + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:InvalidType:(:)[New Object],pArgumentException +FullyQualifiedErrorId:TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

在此对象上找不到属性“rootfolder”。核实 该属性存在并且可以设置。在 C:\script\scripts\pathingworking.ps1:9字符:5 +$foldername.rootfolder=“MyComputer” + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:InvalidOperation:(:)[],运行时异常 +FullyQualifiedErrorId:PropertyNotFound

不能对空值表达式调用方法。在 C:\script\scripts\pathingworking.ps1:11字符:8 +if($foldername.ShowDialog()-eq“OK”) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:InvalidOperation:(:)[],运行时异常 +FullyQualifiedErrorId:InvokeMethodOnFull

此错误会返回两次,对于应该弹出的文件夹选择窗口的每个实例返回一次

我曾尝试从运行对话、快捷方式甚至CLI中使用-STA,但它总是给我这个错误。我已经使用[System.Threading.Thread]:CurrentThread.GetApartmentState()验证了powershell的开放实例是否为STA。我可以打开powershell CLI并导航到脚本所在的文件夹,调用脚本,它会给出错误,然后我可以在同一个CLI中复制\粘贴它,它可以正常工作。我还右键单击了资源管理器中的文件并选择了“使用powershell运行”,它也给出了错误信息。我已经提升了CLI,看看这是否有帮助,但没有成功

我担心这是一个小小的疏忽,希望有人能帮我一把

使用v1.0
由于未加载程序集,windows 10无法找到类型[System.windows.Forms.FolderBrowserDialog]

加载程序集

$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("********Please Select the SOURCE Directory********",0,"Directory Selecter 5000",0x1)

Function Get-Folder($initialDirectory)

{

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.rootfolder = "MyComputer"

    if($foldername.ShowDialog() -eq "OK")
    {
        $folder += $foldername.SelectedPath
    }
    return $folder
}

$a = Get-Folder

$wshellb = New-Object -ComObject Wscript.Shell
$wshellb.Popup("********Please Select the DESTINATION Directory********",0,"Directory Selecter 5000",0x1)
Function Get-Folder($initialDirectory)

{

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.rootfolder = "MyComputer"

    if($foldername.ShowDialog() -eq "OK")
    {
        $folder += $foldername.SelectedPath
    }
    return $folder
}

$b = Get-Folder


Set-Content -Path "C:\script\scripts\script data.txt" -Value "$a" -Force
Set-Content -Path "C:\script\scripts\script data2.txt" -Value "$b" -Force

rerun的答案解决了错误,但没有做太多解释。在ISE中设计脚本(这几乎是我唯一做的)很方便,因为它会自动为您加载类型和模块。如果计划从另一个CLI(命令行解释器)运行脚本,则应养成在脚本早期显式加载所需模块和程序集的习惯,以便在稍后调用这些东西时,PowerShell会知道您的要求

不幸的是,没有简单的方法可以告诉您,当涉及到哪些类型将固有地可用时,您需要做什么,但是一点尝试和错误通常会很快指出这一点,或者如果您查看脚本,发现您正在使用
System.Kitchen.Ita
创建一个新对象,然后,您可能需要首先加载
System.Kitchen
的程序集,以便在需要时它具有可用的意大利面类型,这样您就可以在脚本顶部附近包含一个加载该程序集的调用,而不会造成任何伤害

如前所述,在您的特定情况下,需要加载包含要显示的FolderBrowser对话框的程序集。将以下内容添加为脚本的第一行将解决您看到的错误:

Add-Type -AssemblyName "System.Windows.Forms"

您需要将程序集添加到脚本中:
add Type-AssemblyName System.Windows.Forms
“使用v1.0 Windows 10”如果您是指Powershell v1.0,我甚至不确定这是可能的……谢谢,我真的认为这只是一个简单的疏忽。您可以使用[System.AppDomain]::CurrentDomain.GetAssemblys()转储加载的程序集在ISE中作为一个起点,但这将导致您加载不需要的内容。我知道我们之前已经讨论过这个问题,但我要再说一遍。除了将ISE用于纯编写代码(VisualStudio代码更适合于此),不要将其用于开发。如果必须在那里编写代码,但千万不要在那里运行。始终在CLI中运行它。@EBGreen这是您的意见。我尝试过VSC,当它第一次出现时,我没有看到任何东西比ISE做得更好。我必须再试一次,我相信现在它已经改进了。我完全同意,如果您编写的脚本将在ISE之外的任何地方执行,则需要在CLI中对其进行测试。任何时候你写任何东西都应该是这样。在目标条件下进行测试,以避免出现“…但它在我的开发设备上运行良好”的情况。@TheMadTechnician我的看法。同意。如果没有其他内容,VSC允许我使用Vim插件:)
Add-Type -AssemblyName "System.Windows.Forms"