【发布时间】:2020-09-09 03:54:34
【问题描述】:
为了澄清,我特别询问如何在使用 Shell.Application 时处理错误。或者更重要的是,CAN 一个处理错误,如果是这样,如何处理。字体示例就是这样,我正在尝试解决的当前情况的示例。但问题仍然存在,在使用 Shell.Application 时是否可以处理(而不是避免、处理)错误?答案可能有一些微妙之处,即一般你可以,但特别是在字体示例中不是。情况似乎是这样,我倾向于认为 Shell.Application 是陈旧的、破碎的技术,根本不应该使用,因为它不能在所有用例中都健壮,对我来说,它在任何情况下都可能很脆弱用例。
我正在尝试改进我对 Shell.Application.CopyHere() 的使用,特别是用于安装字体。我希望做的是解决字体文件损坏或不是有效字体文件的偶尔错误。
据我所知,this 确实没有办法解决这个问题。对于显示的任何对话框,我可以使用参数值 16 以“全部是”来响应。也许可以克服错误,但没有返回代码,我无法记录由此产生的错误。在带有 Try/Catch 的 PowerShell 中使用 .CopyHere() 也不起作用。这只是微软刚刚接受失败失败的旧技术吗?还是我错过了解决问题的技术?
编辑:根据我提供的链接,我尝试了 1024 参数,如果发生错误,请不要显示用户界面。 像这样
$fontFolder.CopyHere($fontFilePath, 1024)
似乎没有按照它说的去做,因为我看到一个对话框说
Cannot install bogus.ttf
The file ... does not appear to be a valid font.
因此,不仅无法返回有意义的错误,而且错误的存在会中断脚本的执行并需要用户交互。呃。
编辑 2: 不是一个真正的最小代码示例,因为我的问题是可以做到这一点,甚至在如何之前。但这是我刚刚尝试过的。
fontFilePath = '\\px\Rollouts\Misc\Fonts\bogus.ttf'
$fontFolderPath = "$env:windir\Fonts"
$fontFolder = $(New-Object -ComObject:Shell.Application).Namespace($fontFolderPath)
$fontFolder.CopyHere($fontFilePath, 1024)
根据 1024 参数声称要做的事情,我希望这会失败,但也不会在对话框等待用户交互时停止处理。
另外,值得注意的是 bogus.ttf 只是一个以 TTF 扩展名重命名的空文本文件。所以,保证不会成功安装字体。
【问题讨论】:
-
“我希望做的是解决字体文件损坏或不是有效字体文件的偶尔错误” - 好吧,你想做什么?重试复制操作?跳过它?休息?
-
您的问题需要改进,不仅是为了解决上述评论中提出的问题,还要提供您正在运行的代码的minimal reproducible example,并显示您正在尝试解决的问题地址,以及我们复制您的问题所需的调试信息。如果我们自己无法准确地解决问题,我们将无法帮助您解决问题。
-
@mathias-r-jessen 我想知道发生的错误,这样我就可以记录发生的错误,并跳过一些只有在正确安装字体时才会发生的后续任务。如果我可以像使用 try/catch 那样记录详细的错误,那就更好了,因为它有助于故障排除。但仅仅能够识别错误将是一个好的开始。并且无需用户确定抛出的错误对话框即可继续。
-
@Gordon 请提供您已经尝试处理此案例的内容,否则该问题被视为 StackOverflow 的题外话。这就是提供minimal reproducible example 的意思。
-
@bender-the-greatest 我添加了我目前正在尝试的代码,但 MRE 示例向我提出了一个问题。提出“X 能做到吗?”这样的问题被认为是不恰当的。我希望 Code Review 需要代码,但我认为 Stack Overflow 对更高级别的问题开放,例如“依赖注入的优缺点是什么”,没有代码,甚至没有指定的语言,但(至少对我而言)在更高层次上进行有用的讨论仍有空间。当前的帖子不是一个例子,但这是我想到的一个问题。
标签: powershell