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