我必须在企业环境中使用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)
因此,仅在绝对需要时才使用[sic] ReleaseComObject。
这句话隐含的是,您了解托管代码(在本例中为PowerShell,使用.NET)如何使用COM对象的技术细节。
对于调用脚本运行时COM对象(例如WshShell
,WshShortcut
,WshUrlShortcut
等)的PowerShell脚本,不需要使用ReleaseComObject
,因为.NET运行时(CLR)将在不再使用时自动释放它们。
从PowerShell自动化时,所有COM对象的情况不一定如此,但对于脚本运行时,不需要释放运行时对象。