Bir komutun çıktısına bir değişken ayarlamak için, for /f
:
for /f "tokens=*" %%a in ('command') do set _CmdResult=%%a
Sorun, komutta bir boru kullanmak için komut satırı kaçış karakteriyle kaçmanız gerekir: ^
, bu nedenle: ^|
.
for /f "tokens=*" %%a in ('sc \\192.168.1.1 query <ServiceName> ^| findstr STATUS') do set _CmdResult=%%a
Şimdi, hangi Windows sürümünü kullandığınızdan emin değilim, ancak sc
Windows 7'de sorgu aşağıdaki çıktıyı verir:
>sc query SamSs
SERVICE_NAME: SamSs
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
Bu bir demektir findstr STATE
çıktısını veren gerekli olacaktır:
>sc query SamSs | findstr STATE
STATE : 4 RUNNING
Şimdi, yukarıdaki örnekte, tokens=*
her token değişkene ayarlandığı anlamına gelir %%a
belirteçlerin boşluklarla ayrıldığı yer. Bu durumda, üçüncü simgeyi kullanabilirsiniz ( 4
) veya dördüncü simge ( RUNNING
). Bu arada, testlerle, 1
karşılık gelir STOPPED
benim için.
İşleri kolaylaştırmak için dizeyi kullanacağım RUNNING
bu örnekte. Dördüncü belirteci istiyoruz.
for /f "tokens=4" %%a in ('sc \\192.168.1.1 query <ServiceName> ^| findstr STATE') do set _CmdResult=%%a
Tabii ki, neye bağlı olarak sc query
çıktılar, sizinki biraz farklı olabilir, o yüzden oraya nasıl geldiğimi izleyin ve gerektiğinde değiştirin. Veya bir yorumda çıktınızın çıktısını alın. sc query
ve gerektiği gibi değiştireceğim.
Değeri kontrol etmek için şunları kullanabilirsiniz:
if %_CmdResult%==STOPPED (
REM do something here
)
Senin durumunda, döngü böyle bir şey giderdi.
:loop
for /f "tokens=*" %%a in ('sc \\192.168.1.1 query <ServiceName> ^| findstr STATUS') do set _CmdResult=%%a
if %_CmdResult%==STOPPED (
sc \\192.168.1.1 start <ServiceName>
goto endloop
)
timeout /t 5
goto loop
:endloop
Bunu not et timeout
yalnızca Windows Vista ve sonraki sürümlerinde bulunan bir yardımcı programdır. Windows XP kullanabilir gibi bir şey ping 1.1.1.1 -n 1 -w 5000 > nul
.