web-dev-qa-db-ja.com

コマンドラインを介してプログラムを起動しますが、まだ実行されていない場合のみ

私は以下のバッチファイルを思いつきました、そしてそれは素晴らしい働きをしています。ただし、プログラムがすでに実行されている場合、それをスキップして次のプログラムを起動するようにコード化する方法があるかどうかを知りたいです。これが理にかなっているといいのですが。何かアドバイスをいただければ幸いです。

@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\"
14
user259671

tasklist を使用して、実行中のすべてのアプリケーションに特定の名前があるかどうかを確認する例を次に示します。
それ以外の場合は、プログラムを起動します。あなたはそれをあなたのニーズに適応させることができると確信しています

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

私はスクリプトにタスクリストを実装し、それが魅力のように機能しました。
これは、私と同じ質問をしている人のためのものです。

@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
user259671
@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
3
Santosh

これは(CMDの代わりに)PowerShellバージョンです。

(「powershell.exe」を呼び出すことにより、CMDからPowerShellを実行できます。

このスクリプトは次のことを行います。

  1. 特定のプロセスのプロセスリストをチェックし、プロセスがリストにない場合...
  2. search(プログラムファイルなどの)特定の場所にある実行可能ファイルを検索して実行します。

この例では、Skype for Business(別名 "lync")を起動しています。

ここに1ライナーがあります:

if (!((Get-Process | select ProcessName).ProcessName | where {$_ -like "*lync*"})){&(where.exe /R "C:\Program Files (x86)\Microsoft Office" "lync.exe")}

これはコメント付きバージョンです:

# If there isn't a running process that contains "lync"...
if (!((Get-Process | select ProcessName).ProcessName | where {$_ -like "*lync*"}))
{
    # Find the executable somewhere in program files (x86), and run it.
    &(where.exe /R "C:\Program Files (x86)\Microsoft Office" "lync.exe")
}

(実際に実行可能ファイルを検索する必要はありません。代わりに直接実行できます。ただし、実行可能ファイルを検索すると、MS Officeの更新が可能になり、インストールディレクトリが変更される場合があります)

1
Nullldata

私はnixdaの答えに従いましたが、うまくいきましたが、アプリケーションの複数のコピーがまだ起動しないという問題がありました!!

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

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

例えば:

enter image description here

そのため、タスクリストを使用する代わりに、wmicコマンドを使用して、プロセスがすでに実行されていることを確認しました。

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

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