Honestamente, recomendo usar o PowerShell para algo dessa natureza. PS v5.1 pode ser instalado em qualquer coisa desde o Windows 7 (incluindo 7).
Mas, se você estiver restrito a usar apenas o Prompt de Comando básico, aqui está um arquivo de lote de amostra que deve funcionar.
Lote
@echo off
:: Title - FTView Client Application Finder
:: This what is said if it's not running
set TESTSTR=INFO: No tasks are running which match the specified criteria.
set /A NOTRUNNING=0
:: Iterate over all of the lines produced by the command.
for /F "delims=" %%a in ('tasklist /fi "WINDOWTITLE EQ Grain*"') do (
:: If a line matches the test string, then the program isn't running.
if "%%a"=="%TESTSTR%" (
set /A NOTRUNNING=1
)
)
if %NOTRUNNING%==1 (
echo It is NOT running.
) else (
echo It is running.
)
PowerShell
No entanto, o PowerShell é muito mais extenso. As vantagens seriam:
- Critérios mais rigorosos para corresponder ao processo desejado
- Opções mais extensas para executar processos
- Melhor tratamento de erros
- Melhor controle de fluxo
Como não tenho o programa que você está tentando comparar, será difícil criar um protótipo da solução PowerShell. No entanto, posso compartilhar o processo que levaria para escrevê-lo.
> Get-Process
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
19 5 2764 3752 0.00 12188 1 cmd
824 41 109200 123184 14.46 12520 1 powershell
Apenas listou alguns processos por brevidade.
Com o FTView Client em execução, obtenha o ID do processo (em meus exemplos, usarei o processo powershell.exe
) e, em seguida, execute o seguinte comando:
> Get-Process -Id 12520 | Format-List *
Name : powershell
Id : 12520
PriorityClass : Normal
FileVersion : 10.0.14409.1005 (rs1_srvoob.161208-1155)
HandleCount : 950
WorkingSet : 137814016
PagedMemorySize : 123269120
PrivateMemorySize : 123269120
VirtualMemorySize : 696459264
TotalProcessorTime : 00:00:15.3192982
SI : 1
Handles : 950
VM : 696459264
WS : 137814016
PM : 123269120
NPM : 42680
Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Company : Microsoft Corporation
CPU : 15.3192982
ProductVersion : 10.0.14409.1005
Description : Windows PowerShell
Product : Microsoft® Windows® Operating System
__NounName : Process
BasePriority : 8
ExitCode :
HasExited : False
ExitTime :
Handle : 3492
SafeHandle : Microsoft.Win32.SafeHandles.SafeProcessHandle
MachineName : .
MainWindowHandle : 919266
MainWindowTitle : Administrator: Windows PowerShell
MainModule : System.Diagnostics.ProcessModule (powershell.exe)
MaxWorkingSet : 1413120
MinWorkingSet : 204800
Modules : {System.Diagnostics.ProcessModule (powershell.exe), System.Diagnostics.ProcessModule
(ntdll.dll), System.Diagnostics.ProcessModule (aswhooka.dll),
System.Diagnostics.ProcessModule (kernel32.dll)...}
NonpagedSystemMemorySize : 42680
NonpagedSystemMemorySize64 : 42680
PagedMemorySize64 : 123269120
PagedSystemMemorySize : 527352
PagedSystemMemorySize64 : 527352
PeakPagedMemorySize : 193662976
PeakPagedMemorySize64 : 193662976
PeakWorkingSet : 206139392
PeakWorkingSet64 : 206139392
PeakVirtualMemorySize : 711643136
PeakVirtualMemorySize64 : 711643136
PriorityBoostEnabled : True
PrivateMemorySize64 : 123269120
PrivilegedProcessorTime : 00:00:07.3320470
ProcessName : powershell
ProcessorAffinity : 255
Responding : True
SessionId : 1
StartInfo : System.Diagnostics.ProcessStartInfo
StartTime : 1/17/2018 20:45:30
SynchronizingObject :
Threads : {9812, 14088, 924, 14064...}
UserProcessorTime : 00:00:08.0184514
VirtualMemorySize64 : 696459264
EnableRaisingEvents : False
StandardInput :
StandardOutput :
StandardError :
WorkingSet64 : 137814016
Site :
Container :
Isso mostrará todas as propriedades que você pode filtrar. A razão pela qual menciono essa etapa é porque as informações aqui são um pouco diferentes do que foi usado no arquivo em lotes. Vamos ver MainWindowTitle
.
MainWindowTitle : Administrator: Windows PowerShell
Ele contém exatamente o que é exibido na barra de título da janela. Se quiséssemos filtrar nossa seleção com base nisso, usaríamos o comando:
> Get-Process | Where-Object -Filter-Object MainWindowTitle -Like "*PowerShell*"
E isso seria como você determina se esse processo está sendo executado. Para usar isso em uma declaração condicional, você pode fazer:
> $process = Get-Process | Where-Object -Filter-Object MainWindowTitle -Like "*PowerShell*"
> $process.Count
1
> If ($process.Count -gt 0) { Write-Host Yes } Else { Write-Host No }
Yes
Você pode então iniciar o aplicativo usando Start-Process
.
Ao usar o PowerShell, seu script será mais robusto e terá apenas duas linhas de código.
$process = Get-Process | Where-Object -Filter-Object MainWindowTitle -Like "Grain*"
If ($process.Count -eq 0) { Start-Process FTView.exe }
Se você usar Get-Help Start-Process
, verá que há várias opções que você pode usar para iniciar o processo, como passar argumentos, usar credenciais, ocultar a janela, etc.