none
特定のリンク先に向いているショートカットの削除 RRS feed

  • 質問

  • 現場にある端末にて、特定のパス(C:\test\の中のexe)にリンクしているショートカット(デスクトップのみの予定)を削除したいです。

    どなたか良いサンプルをご存知でしたら教えて下さい。

    ちなみにPowerShellに拘るつもりはありません。

    バッチでは出来ないと判断し、WSHもPowerShellもどちらも使った事が無いため、

    どうせなら新しい方でやってみようかと思った次第でして…。

    2015年12月1日 2:49

回答

  • チャブーンです。

    何か条件があるようでしたので、それに合わせて作ってみました。Get-ChildItemで取得したオブジェクトだとShortCutのTargetPathが呼び出せないようなので、Get-Itemとして呼び出して代入しています。

    $Items=Get-ChildItem $Env:USERPROFILE\Desktop|Where {$_.extension -eq ".lnk"} Foreach ($Item in $Items) {
    $objItem=Get-Item $Item.Fullname $Shell=New-Object -comobject Wscript.Shell IF (($Shell.CreateShortcut($objItem)).TargetPath -match "C:\\Test\\.+\.exe") { Write-Host $Item.Fullname "を削除します。" Remove-Item $Item.Fullname -force } Else { Write-Host $Item.Fullname "は削除しません。" } }

    追記:任意のフォルダで実行できるよう、スクリプトの一部を修正しておきます。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。






    • 回答としてマーク KAZU-DENSAN 2015年12月1日 5:32
    • 回答としてマークされていない KAZU-DENSAN 2015年12月1日 5:44
    • 回答としてマーク KAZU-DENSAN 2015年12月1日 5:44
    • 編集済み チャブーンMVP 2015年12月1日 6:36 スクリプトを修正
    2015年12月1日 4:04

すべての返信

  • チャブーンです。

    同じことを考えられる方はおられるようで、答えが載っていましたよ。

    http://d.hatena.ne.jp/Wacky/20090308/1236496903

    $Item=Get-Item .\notepad.exe.lnk
    
    $Shell=New-Object -comobject Wscript.Shell
    IF (($Shell.CreateShortcut($Item)).TargetPath -match "notepad.exe") {
        Write-Host $Item.Fullname "を削除します。"
        Remove-Item $Item -force
    }
    Else {
        Write-Host $Item.Fullname "は削除しません。"
    }

    要は、取り込んだショートカット情報を基に新しいショートカットを擬似的に作成して、そのプロパティ情報を読んだ、ということですね。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2015年12月1日 3:49
  • チャブーンです。

    何か条件があるようでしたので、それに合わせて作ってみました。Get-ChildItemで取得したオブジェクトだとShortCutのTargetPathが呼び出せないようなので、Get-Itemとして呼び出して代入しています。

    $Items=Get-ChildItem $Env:USERPROFILE\Desktop|Where {$_.extension -eq ".lnk"} Foreach ($Item in $Items) {
    $objItem=Get-Item $Item.Fullname $Shell=New-Object -comobject Wscript.Shell IF (($Shell.CreateShortcut($objItem)).TargetPath -match "C:\\Test\\.+\.exe") { Write-Host $Item.Fullname "を削除します。" Remove-Item $Item.Fullname -force } Else { Write-Host $Item.Fullname "は削除しません。" } }

    追記:任意のフォルダで実行できるよう、スクリプトの一部を修正しておきます。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。






    • 回答としてマーク KAZU-DENSAN 2015年12月1日 5:32
    • 回答としてマークされていない KAZU-DENSAN 2015年12月1日 5:44
    • 回答としてマーク KAZU-DENSAN 2015年12月1日 5:44
    • 編集済み チャブーンMVP 2015年12月1日 6:36 スクリプトを修正
    2015年12月1日 4:04
  • ありがとう御座いました。

    同じサイトを見ていたのですが、今の知識では書き換えできないため

    もっと近いサンプルが無いかと思い、質問させて頂きました。

    ほぼそのまま利用出来る形でのコードを教えて頂き、感謝致します。

    Remove-Item $Item -force 
    ↓
    Remove-Item $Item.Fullname -force

    とする事で、想定通りの動きになりました。


    2015年12月1日 5:42
  • チャブーンです。

    Remove-Item $Item -force
    ↓
    Remove-Item $Item.Fullname -force

    とする事で、想定通りの動きになりました。

    私の方でも動作は確かめましたが、私のスクリプトは%USERPROFILE%\Desktopにおいて実行していたので、(削除対象がカレントディレクトリにあるので)問題がなかった、ということでしょう。

    任意のフォルダで実行いただく場合は、FullNameプロパティでフルパスを拾ってもらう必要がありますね。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2015年12月1日 6:06
  • チャブーンです。

    前のコードは、わざわざGet-Itemでオブジェクトのとり直しを行っていてイケていないな、と思い見直したところ、Shell.CreateShortCut()の引数は単に実行ファイルのフルパスが入ればよい、と気づきました。それをふまえて直したコードを一応張っておきます。

    $Items=Get-ChildItem $Env:USERPROFILE\Desktop|Where {$_.extension -eq ".lnk"}
    
    Foreach ($Item in $Items) {
        $Shell=New-Object -comobject Wscript.Shell
        IF (($Shell.CreateShortcut($Item.Fullname)).TargetPath -match "C:\\Test\\.+\.exe") {
            Write-Host $Item.Fullname "を削除します。"
            Remove-Item $Item.Fullname -force
        }
        Else {
            Write-Host $Item.Fullname "は削除しません。"
        }
    }
    
    


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2015年12月2日 1:54