脚本在伊势中工作,而不是某些Powershell CLI

mo49yndu  于 2023-11-18  发布在  Shell
关注(0)|答案(3)|浏览(193)
$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

字符串
所以这个脚本在伊势中工作,如果我将其复制/粘贴到CLI中,就是这样。如果我导航到powershell CLI中的文件夹并从那里运行它,它会给我这个错误:
新对象:找不到类型[System.Windows.Forms.FolderBrowserDialog]:请验证是否已加载包含此类型的程序集。At C:\script\scripts\pathingworking.ps1:8 char:19 + $foldername = New-Object System.Windows.Forms.FolderBrowserDialog + ~ + CategoryInfo:InvalidType:(:)[New-Object],PS
在此对象上找不到属性“rootfolder”。请验证该属性是否存在并且可以设置。在C:\script\scripts\pathingworking.ps1:9 char:5 + $foldername.rootfolder =“MyComputer”+ ~
不能对空值表达式调用方法。在C:\script\scripts\pathingworking.ps1:11 char:8 + if($foldername.ShowDialog()-eq“OK”)+ ~ + CategoryInfo:InvalidOperation:(:)[],RuntimeException + FullyError fiedErrorId:RunkeMethodOnError
此错误返回两次,每次弹出文件夹选择窗口时返回一次。
我已经尝试了-STA从运行对话框,快捷方式,甚至从CLI,它总是给我这个错误。我已经使用[System.Threading.Thread]::CurrentThread.GetApartmentState()验证了powershell的打开示例是STA。我可以打开一个powershell CLI,导航到脚本所在的文件夹,调用脚本,它会给我错误,然后我可以复制\粘贴它在同一个确切的CLI中,它没有问题。我也右键单击资源管理器中的文件,并选择“与powershell一起运行”,它也给我错误。我已经提升了CLI,看看这是否有帮助,但没有成功。
我担心这是一些小的疏忽,希望有人能给予帮助。
使用v1.0 windows 10

k5ifujac

k5ifujac1#

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

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

字符串

8ljdwjyq

8ljdwjyq2#

ESTA的答案解决了错误,但没有做很多解释。在伊势中设计脚本(这是我几乎专门做的)很方便,因为它会自动为您加载类型和模块。(命令行解释器)您应该养成在脚本早期显式加载所需模块和程序集的习惯,这样,当稍后调用这些东西时,PowerShell就会知道你在请求什么。
不幸的是,没有简单的方法来告诉你需要做什么,当涉及到什么类型将是固有的可用,但一个小的试验和错误通常会很快指出,或者如果你看看你的脚本,看到你正在使用System.Kitchen.Pasta创建一个新对象,那么你可能需要首先加载System.Kitchen的程序集,以便在需要时它具有可用Pasta类型,因此您可以在脚本顶部附近包含一个调用来加载程序集,而不会造成任何损害。
在您的特定情况下,正如已经指出的那样,您需要加载包含要显示的FolderBrowserDialog框的程序集。将以下内容添加为脚本的第一行将解决您看到的错误:

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

字符串

mbzjlibv

mbzjlibv3#

@陈:谢谢,这也帮助我解决了我的问题(请参阅Add-type -AssemblyName“System.Web”以确定Powershell 7的MIME类型在伊势中有效,但在Powershell中无效)。
我在powershell.exe和伊势(powershell_ise.exe)中都运行了这个命令。在前者中,没有名为System.Web的程序集,但我在后者中找到了它。
在此期间进行的搜索已经帮助我弄清楚了Powershell 7中的using assembly需要. dll的完整路径。
一开始我使用了using assembly System.Web,但是没有用。在@ jacket的提示下,我找到了一个条目C:\WINDOWS\Microsoft.Net\assembly\GAC_64\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll
我在脚本的开头使用了这个using assembly "C:\WINDOWS\Microsoft.Net\assembly\GAC_64\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll,最终完成了任务。
谢谢您的支持:)
运行代码如下所示:

using assembly "C:\WINDOWS\Microsoft.Net\assembly\GAC_64\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll"

$FilePath = "C:\users\Daniel\Desktop\test.pdf"

$DocExtension = [System.IO.Path]::GetExtension($FilePath)
$DocMimeType  = [System.Web.MimeMapping]::GetMimeMapping($DocExtension)

Write-Output "Extension: $DocExtension `nMIME-type: $DocMimeType"

字符串

相关问题