Excel ワークブックで作業している .vbs ファイルがあります。システムで 3 つの EXCEL.EXE プロセスが実行されている arsie の状況を想定してみましょう。
2 に答える
このpowershellにタグを付けたとしても、VBSのみのオプションは、Excelのバージョンによっては多少の調整が必要になる場合があります(このPCには2003があります):
'Create Excel Application for demo purposes only
Dim ex: Set ex = CreateObject("Excel.Application")
Dim objWMIService, objProcess, colProcess
Dim strComputer, strList
strComputer = "." 'Change if you want to run on another computer
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
'Look only at Excel process name
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where NAME = 'EXCEL.exe'")
'Get the list of Processes, included only for demo purposes
For Each objProcess In colProcess
strList = strList & vbCr & objProcess.commandline
Next
MsgBox strList ' Displayed "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE"
'"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" / automation - Embedding
' Second row was the created Object.
'Find processes that match the Created Object format commandline
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where CommandLine Like '%EXCEL.exe"" /automation -Embedding'")
For Each objProcess In colProcess
'Do something with process
objProcess.Terminate
Next
'Next line will cause runtime error due to process already being terminated.
ex.Quit
これに似たメソッドの優れた点は、objProcess.Commandline を使用することで、特定のプロセスを特定するために使用できる、アプリケーションに送信されるコマンド ライン スイッチを見つけることができることです。たとえば、次のような Excel ファイルを開く .bat ファイルがある場合:プロセスは、プロセスのコマンドライン プロパティ内にstart Excel.exe C:\example.xls
含まれます。C:\example.xls
Get-WMIObject win32_process
すべてのプロセスのリストを取得するために使用します。member を見ParentProcessId
て、どのプロセスがどの Excel インスタンスを生成したかを確認します。
VBScript は WScript または CScript を介して実行されるため、最初に正しい親を確認する必要があります。
Windows はプロセス ID をリサイクルすることに注意してください。つまり、時刻 t0 で pid 1000 が時刻 t1 と同じプロセスであるとは限りません。
補遺:
スイッチを使用-Computername
して、WMI クエリ用に別のコンピューターを指定します。スイッチが存在しない場合-Computername
は、localhost が想定されます。.
ローカル ホストは、上記の VBScript の回答で使用されたとしても知られています。そのようです、
#Get process list from Server01, assuming you have sufficient rights
Get-WMIObject win32_process -Computername server01