脚本在ISE中工作,而不是在一些PowerShell CLI中工作

时间:2018-04-17 21:11:19

标签: powershell

$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

所以这个脚本在ISE中运行,如果我将它复制/粘贴到CLI中就可以了。如果我导航到powershell CLI中的文件夹并从那里运行它会给我这个错误:

  

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

     

属性' rootfolder'在这个对象上找不到。验证   该属性存在且可以设置。在   C:\ script \ scripts \ pathingworking.ps1:9 char:5   + $ foldername.rootfolder =" MyComputer"   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(:) [],RuntimeException       + FullyQualifiedErrorId:PropertyNotFound

     

您无法在空值表达式上调用方法。在   C:\ script \ scripts \ pathingworking.ps1:11 char:8   + if($ foldername.ShowDialog()-eq" OK")   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(:) [],RuntimeException       + FullyQualifiedErrorId:InvokeMethodOnNull

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

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

我担心这是一个小小的疏忽,希望有人可以帮助我。

使用v1.0 Windows 10

2 个答案:

答案 0 :(得分:2)

找不到类型[System.Windows.Forms.FolderBrowserDialog]是由于程序集未加载。

使用

加载程序集
Add-Type -AssemblyName "System.Windows.Forms"

答案 1 :(得分:1)

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

不幸的是,没有简单的方法来告诉你需要做什么,因为什么类型的内在可用,但一些试验和错误通常会很快指出它,或者如果你看看你的脚本并看到你正在用System.Kitchen.Pasta创建一个新对象,那么你可能需要首先加载System.Kitchen的程序集,以便它在你需要的时候可以使用Pasta类型,所以你可以包括调用以在脚本顶部附近加载该程序集而不会造成任何伤害。

在特定情况下,正如已经指出的那样,您需要加载包含要显示的FolderBrowserDialog框的程序集。将以下内容添加为脚本的第一行将解决您看到的错误:

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