9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?