2017-12-26 65 views
-1

エンタープライズ環境でPowerShellでショートカット(.lnk)を一括変更する必要があります。 ユーザーのデスクトップに間違ったショートカットがある可能性があります。デスクトップフォルダは、当社の中央ストレージにあります。ショートカットに間違った引数がある場合、それらを修正する必要があります。私は約5.000ユーザーを話している。ショートカットの操作(ReleaseComObject?)

私のコードは正常に動作しています。 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()について? すべてのオブジェクトの後でこれを行う必要がありますか? これはなくても働いています。私はそれを使用する必要がありますか?

EDIT:
私はそれがこのような正しいことだと思う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

これは、メモリ、クリーンアップジョブなどからオブジェクト/プロセスを解放することを意味します。常に動作するとは限りません。場合によってはプロセスを強制終了する必要があります。 – Avshalom

+1

はい、あなたは 'com 'オブジェクトはリソースを解放し、メモリリークを回避します。 – TheIncorrigible1

+0

[Documentation](https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject(v = vs.110).aspx) – gms0ulman

答えて

0

the documentationによると:

したがって、[原文]を使用しますReleaseComObjectは、絶対に必要な場合にのみ使用します。

この文では、マネージコード(この場合は.NETを使用するPowerShell)がCOMオブジェクトをどのように使用するかの技術的な詳細を理解しています。 (などWshShellWshShortcutWshUrlShortcut、など)のスクリプト実行時のCOMオブジェクトを呼び出すPowerShellスクリプトについては

、.NETランタイム(CLR)としてReleaseComObjectを使用する必要はありません、彼らはでなくなったときに自動的にそれらを解放しませんつかいます。

これは、PowerShellから自動化された場合、必ずしもすべてのCOMオブジェクトのケースではありませんが、スクリプト実行時オブジェクトの解放は不要です。