在我的脚本结束时我使用'ie' | ForEach-Object {Remove-Variable $_ -Force}.它在PS 2(Windows 7)中工作正常,但PS 5(Windows 10)引发错误:
无法删除变量,即因为变量已经过优化且无法移除.尝试使用Remove-Variable cmdlet(不带任何别名),或者使用您正在使用的命令来删除变量.
怎样才能让它与PS 5搭配得更好; 或者我应该使用Remove-Variable 'ie' -Force?
删除COM对象的推荐方法是调用ReleaseComObject方法,将对象引用($ ie)传递给COM对象的实例.
以下是来自Windows PowerShell本周提示的更详细说明和示例代码,其中显示了如何摆脱COM对象:
每当从公共语言运行库调用COM对象时(恰好是从Windows PowerShell调用COM对象时执行的操作),该COM对象将包装在"运行时可调用包装器"中,并且引用计数为增加; 该引用计数有助于CLR(公共语言运行库)跟踪正在运行的COM对象,以及正在运行的COM对象的数量.从Windows PowerShell中启动Excel时,Excel将在运行时可调用包装器中打包,并且引用计数增加到1.
这很好,除了一件事:当你调用Quit方法并终止Excel时,CLR的引用计数不会减少(也就是说,它不会重置为0).并且因为引用计数不为0,所以CLR保持对COM对象的保持:除此之外,这意味着我们的对象引用($ x)仍然有效并且Excel.exe进程继续运行.这绝对不是一件好事; 毕竟,如果我们希望Excel继续运行,我们可能不会首先调用Quit方法....
...调用ReleaseComObject方法[with]我们的Excel实例...减少相关对象的引用计数.在这种情况下,这意味着它将把我们的Excel实例的引用计数从1更改为0.这是一件好事:一旦引用计数达到0,CLR就会释放它对象的持有并且进程终止.(而这次它确实终止了.)
Run Code Online (Sandbox Code Playgroud)$x = New-Object -com Excel.Application $x.Visible = $True Start-Sleep 5 $x.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($x) Remove-Variable x
消息"无法删除变量,即因为变量已经过优化且无法移除".你得到的,很可能意味着你已经尝试访问(检查,观察或以其他方式访问)已被优化器删除的变量.
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |