使用快捷方式(ReleaseComObject?)

时间:2017-12-26 08:47:52

标签: powershell com

我必须在企业环境中使用PowerShell批量更改快捷方式(.lnk)。 用户的桌面上可能有错误的快捷方式。桌面文件夹位于我们的中央存储中。如果快捷方式有错误的参数,我需要纠正它们。我说的是5000个用户。

我的代码准备就绪,工作正常。它基于我在Google上找到的一些例子。

在某些例子中,我确实看到了类似的内容:

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ShortcutObject)

我不知道这是为了什么?

分解我的代码的相关部分如下:

$UserShortcuts = Get-ChildItem -Path "MyFolder" -ChildPath "SmithJ\Desktop") -Filter *.lnk |
                 Where-Object Name -Match "MyShortcut"

foreach ($UserShortcut in $UserShortcuts) {
    $sh = New-Object -ComObject WScript.Shell
    $ShortcutObject = $sh.CreateShortcut($($UserShortcut.FullName))

    $ShortcutObject.Arguments
    # ...
}

ReleaseComObject()怎么样? 每个物体后我都必须这样做吗? 它没有工作。我必须使用它吗?

修改
有了Bill_Stewart的信息,我认为这样是正确的:

$UserShortcuts = Get-ChildItem -Path "MyFolder" -ChildPath "SmithJ\Desktop") -Filter *.lnk |
                 Where-Object Name -Match "MyShortcut"

$sh = New-Object -ComObject WScript.Shell

foreach ($UserShortcut in $UserShortcuts) {
    $ShortcutObject = $sh.CreateShortcut($($UserShortcut.FullName))
    $ShortcutObject.Arguments
    # ...
}

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sh)

1 个答案:

答案 0 :(得分:0)

根据the documentation

  

因此,只有在绝对需要时才使用[ sic ] ReleaseComObject。

这句话隐含的是,您了解托管代码(在本例中为PowerShell,使用.NET)如何使用COM对象的技术细节。

对于调用脚本运行时COM对象(例如WshShellWshShortcutWshUrlShortcut等)的PowerShell脚本,不需要使用ReleaseComObject作为。 NET运行时(CLR)将在不再使用时自动释放它们。

从PowerShell自动化时,所有COM对象的情况不一定如此,但是对于脚本运行时,不需要释放运行时对象。