我一直在编写从Exchange Online中删除移动的设备的脚本。除此之外,其他一切都正常:
foreach ($item in $userdevices) {
Remove-MobileDevice -Identity $item -whatif
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($item) | Out-Null
}
这行[System.Runtime.Interopservices.Marshal]::ReleaseComObject($item) | Out-Null
是脚本不挂起所必需的,但由于与Mac不兼容,它输出了错误。
我收到的错误是:
MethodInvocationException: /Users/XXX/XXX/MDM.ps1:80:17
Line |
80 | … [System.Runtime.Interopservices.Marshal]::ReleaseComObjec …
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Exception calling "ReleaseComObject" with "1" argument(s): "COM Interop is not supported on this platform."
我尝试添加try
-catch
机制,-ErrorAction SilentlyContinue
,-WarningAction SilentlyContinue
和其他一些变体,但没有成功。我得到以下错误:
ParserError: /Users/XXX/XXX/MDM.ps1:80:83
Line |
80 | … nteropservices.Marshal]::ReleaseComObject($item) -ErrorAction:Silentl …
| ~~~~~~~~~~~~
| Unexpected token '-ErrorAction' in expression or statement.
1条答案
按热度按时间bvuwiixz1#
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($item)
是一个 * 表达式 *(一个.NET方法调用),为了静默 * 异常*(又名 * 语句终止错误 *),它可能会抛出,你需要try { ... } catch { ... }
:注意:
$null = ...
是... | Out-Null
的一个性能更好的替代方案-有关详细信息,请参阅this answer。注:
catch
块中的自动$_
变量获得异常对象;你可以用throw
(不需要参数)* 重新抛出 * 异常。$Error
变量。至于你所尝试的:
这会导致语法错误,因为公共
-ErrorAction
参数(与所有common parameters一样,也就是-WarningAction
)仅适用于 * 命令 *,更具体地说,适用于 * cmdlet *(例如,Get-ChildItem
)和 * advanced函数和脚本 *(其行为类似于cmdlet,但与前者不同的是,它是通过 * 编译代码 (.NET程序集)实现的,是在PowerShell 中编写的)。请注意,表达式和命令都是根据about_Parsing帮助主题中讨论的 separate syntax rules aka parsing modes 进行解析的。