LoginSignup
9
10

More than 5 years have passed since last update.

コマンドラインからアプリをアンインストールするVBScript

Posted at

大量のPCを新規セットアップする際に不要なプレインストールソフトをアンインストールするのが面倒だったので、バッチからアンインストールできるスクリプトを作成。

'
' アプリケーションをアンインストールする
'
'  ※msiexecの場合は管理者権限で実行
'
' 使い方:
'   アンインストールコマンドを表示
'     cscript uninst.bat show [名前]
'   アンインストールコマンドを実行
'     cscript uninst.bat uninstall [名前]
'
' 戻り値:
'   0 = 成功
'   1 = 引数が不正
'   2 = アンインストール失敗
'

'========================================
' Function RegGetUninstStr(<レジストリのパス>, <アプリケーション名>)
'   指定されたレジストリからアンインストールコマンドを取得
'========================================
Function RegGetUninstStr(strRegSoft, strAppName)
    'レジストリのサブキーを取得するために、
    'WMIのStdRegProvを使用する
    Set objReg = GetObject("winmgmts://./root/default:StdRegProv")

    Const HKLM = &H80000002

    'アンインストーラ情報の場所
    strBaseKey = strRegSoft & "Microsoft\Windows\CurrentVersion\Uninstall\"

    'レジストリパスから、サブキーを取得
    objReg.EnumKey HKLM, strBaseKey, arrSubKeys

    'サブキーからアンインストールコマンドを検索
    RegGetUninstStr = ""
    For Each strSubKey In arrSubKeys
        'アプリケーション名を取得
        intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, _
        "DisplayName", strValue)
        If intRet <> 0 Then
            intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, _
            "QuietDisplayName", strValue)
        End If
        '指定されたアプリケーションであれば..
        If strValue <> "" Then
            If strValue = strAppName Then
                'アンインストールコマンドを取得
                intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, _
                "UninstallString", strUninst)
                If strUninst <> "" Then
                    '戻り値にセットして検索終了
                    RegGetUninstStr = strUninst
                    Exit For
                End If
            End If
        End If
    Next
End Function

'========================================
' Function UninstallString(<アプリケーション名>)
'   アンインストールコマンドを取得
'========================================
Function UninstallString(strAppName)
    '64bit用アンインストールコマンドを取得
    strVal = RegGetUninstStr("Software\", strAppName)
    '見つからなければ32bit用アプリから検索
    If strVal = "" Then
        strVal = RegGetUninstStr("Software\Wow6432Node\", strAppName)
    End If
    'アンインストールコマンドを返す
    UninstallString = strVal
End Function

'========================================
' Sudo <実行コマンド名>, <引数>
'   管理者権限でコマンド実行
'========================================
Sub Sudo(strCmd, strArg)
    ' 管理者権限チェック
    flagPermitted = false
    Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set osInfo = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
    For Each os in osInfo
        If left(os.Version, 3) >= 6.0 Then
            flagPermitted = true
        End If
    Next

    ' カレントディレクトリ取得
    Set objWShell = WScript.CreateObject("WScript.Shell")
    strCD = objWShell.CurrentDirectory

    ' コマンド実行
    Set objApp = WScript.CreateObject("Shell.Application") 
    If flagPermitted Then
        ' 権限が無いので昇格して実行
        objApp.ShellExecute strCmd, strArg, strCD, "runas", 1
    Else
        ' 権限があるのでそのまま実行
        objApp.ShellExecute strCmd, strArg, strCD, "", 1
    End If
End Sub

'========================================
' Run <実行コマンド(引数付き)>
'   一般ユーザー権限でコマンド実行
'========================================
Sub Run(strCmd)
    Set objShell = WScript.CreateObject("WScript.Shell")
    if Left(strCmd, 1) = """" Then
        'コマンド文字列がダブルクオートで括られていればそのまま実行
        objShell.Run strCmd, 1, TRUE
    Else
        'コマンド文字列をダブルクオートで括って実行
        objShell.Run """" & strCmd & """", 1, TRUE
    End If
End Sub

'========================================
' メイン
'========================================
'引数チェック
If WScript.Arguments.Count < 2 Then
    ' 引数が不正
    WScript.Quit(1)
End If

'実行する処理の選択
Select Case UCase(WScript.Arguments(0))
    Case "UNINSTALL"
        '「アンインストール実行」を選択
        flagRun = true
    Case "SHOW"
        '「アンインストールコマンド表示」を選択
        flagRun = false
    Case Else
        ' 引数が不正
        WScript.Quit(1)
End Select

'アプリケーション名取得
strAppName = WScript.Arguments(1)

If flagRun Then
    WScript.echo "アンインストール開始: " & strAppName
Else
    WScript.echo "アンインストールコマンド: " & strAppName
End If
strVal = UninstallString(strAppName)
If strVal <> "" Then
    'アンインストーラが見つかった
    Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

    'アンインストールコマンドをコマンド名と引数に分割
    ' ※msiexecかどうかを調べるだけなので複雑なパースは不要
    aryStr = Split(strVal, " ", 2)
    strCmd = aryStr(0)
    strArg = aryStr(1)

    'コマンドによって処理を切り替え(MSIEXECかそれ以外)
    If StrComp(objFS.getBaseName(strCmd), "msiexec", 1) = 0 Then
        'コマンドが MSIEXEC だった
        If StrComp(Left(strArg, 2), "/X", 1) = 0 Then
            'アンインストールコマンドなのでオプション追加(リセットなし、確認なし)
            strArg = strArg & " /norestart /qn"
        ElseIf StrComp(Left(strArg, 2), "/I", 1) = 0 Then
            '構成コマンドなのでコマンドを書き換えてオプション追加(リセットなし、確認なし)
            strArg = "/X" & Mid(strArg, 3) & " /norestart /qn"
        Else
            '不明なオプションなのでそのまま実行
        End If
        If flagRun Then
            'MSIEXECは管理者権限で実行
            Sudo strCmd, strArg
        Else
            'アンインストールコマンドを表示して終了
            WScript.echo strCmd & " " & strArg
            WScript.Quit(0)
        End If
    Else
        ' その他
        If flagRun Then
            ' 一般ユーザー権限で実行
            Run strVal
        Else
            'アンインストールコマンドを表示して終了
            WScript.echo strVal
            WScript.Quit(0)
        End If
    End If

    ' アンインストールチェック
    strVal = UninstallString(strAppName)
    If strVal = "" Then
        ' アンインストール完了
        WScript.Quit(0)
    Else
        ' アンインストール失敗
        WScript.Quit(2)
    End If
Else
    ' アンインストーラが見つからなかった
    WScript.Quit(0)
End If
9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10