コマンドラインからプログラムを起動する(ただし、まだ実行されていない場合のみ)

コマンドラインからプログラムを起動する(ただし、まだ実行されていない場合のみ)

下記のバッチ ファイルを作成しましたが、うまく動作しています。ただし、プログラムがすでに実行されている場合は、それをスキップして次のプログラムを起動するようにコーディングする方法があるかどうか知りたいです。これが理にかなっていることを願っています。アドバイスをいただければ幸いです。

@echo off    
pushd    
start "" cmd /c cscript "C:\Users\User\Desktop\Work.vbs"    
start "C:\Program Files\Microsoft Office\Office15" Outlook.exe    
start "C:\Program Files\Microsoft Office\Office15" Lync.exe    
start "C:\Program Files (x86)\Google\Chrome\Application" chrome.exe    
runas /savecred /user:"DOMAIN\User_Adm" "C:\Program Files (x86)\VMware\Infrastructure\Virtual Infrastructure Client\Launcher\VpxClient.exe"    
runas /savecred /user:"DOMAIN\User_Adm" "mmc.exe \"My_Tools.msc\"

答え1

以下は使用例ですタスクリスト実行中のすべてのアプリケーションで、指定した名前のものをチェックします。
そうでない場合はプログラムを起動します。必要に応じて調整できると思います。

tasklist /nh /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul || (start notepad.exe)

答え2

私は自分のスクリプトにタスクリストを実装しましたが、うまく機能しています。
私と同じ疑問を持っている人のためにここに示します。

@echo off
pushd
tasklist /nh /fi "imagename eq iexplore.exe" | find /i "iexplore.exe" > nul ||(start Work.vbs)
tasklist /nh /fi "imagename eq outlook.exe" | find /i "outlook.exe" > nul ||(start outlook.exe)
tasklist /nh /fi "imagename eq lync.exe" | find /i "lync.exe" > nul ||(start lync.exe)
tasklist /nh /fi "imagename eq chrome.exe" | find /i "chrome.exe" > nul ||(start chrome.exe)
tasklist /nh /fi "imagename eq VpxClient.exe" | find /i "VpxClient.exe" > nul || runas /savecred /user:"DOMAIN\User_Adm" "C:\Program Files (x86)\VMware\Infrastructure\Virtual Infrastructure Client\Launcher\VpxClient.exe"
tasklist /nh /fi "imagename eq mmc.exe" | find /i "mmc.exe" > nul || runas /savecred /user:"DOMAIN\User_Adm" "mmc.exe \"My_Tools.msc\"

答え3

@echo off      
tasklist /FI "IMAGENAME eq outlook.exe" | find /i "outlook.exe"      

IF ERRORLEVEL 2 GOTO LOOP2
IF ERRORLEVEL 1 GOTO LOOP1 

:LOOP1 
  start notepad.exe
goto EXIT     

:LOOP1 
  start outlook.exe 
goto EXIT 

:EXIT

答え4

私は nixda の回答に従いましたが、うまくいきました。しかし、アプリケーションの複数のコピーがまだ起動しているという問題が発生しました。

これは私の .exe 名が長いことが原因だったので、他の人にも同じ問題がある場合に備えて、nixda の回答の調整バージョンをここに追加しようと思いました。

.exe 名が「SomeReallyVerySuperLongProgram.exe」のように長い場合、tasklist は出力を切り捨てます。つまり、出力を find コマンドにパイプすると失敗し、アプリケーションの 2 番目のインスタンスが開きます。

例えば:

ここに画像の説明を入力してください

そのため、tasklist を使用する代わりに、wmic コマンドを使用して、プロセスがすでに実行されているかどうかを確認しました。

これが私の調整したバージョンです:

wmic process where "name='win32calc.exe'" get ProcessID | find /i "ProcessId" > nul || (start /min win32calc.exe)

関連情報