*/ EDIT
How do I set ORACLE_SID only with the final part of the service name, and how do I return it only once, without repeating the same ORACLE_SID value earlier?
- Note: The answer also covers other points addressed in another author’s post (already duly deleted by moderation), where in this, have a deviation from the original question the origin of the 3rd item listed below/answered
Get your substring
in: first occurrence
Get your substring
in: last occurrence
Get your substring
of: each occurrence
- Get your
substring
of each occurrence Edit
@echo off
Setlocal EnableDelayedExpansion
pushd %__APPDIR__% && set "_svrc=OracleService"
for /f "tokens=*" %%s in ('sc query ^| find "_NAME:" ^| find /i "%_svrc%"')do (
set /a "_cnt+=1+0" && set "_str=%%~s" && call set "_base_!_cnt!=!_str:*%_svrc%=!"
)
if not defined _cnt (
>nul chcp 65001
echo\Servico %_svrc% não se encontra em execução
) else (
for /L %%i in (1 1 !_cnt!)do call echo\Nome da Base: !_base_%%~i!
)
timeout.exe -1
popd
endlocal
- Compact and unused version "didactic layout" in the code:
@echo off && Setlocal EnableDelayedExpansion
set "_svrc=OracleService" & >nul chcp 65001 | pushd %__APPDIR__%
for /f tokens^=* %%s in ('sc.exe query^|find "_NAME:"^|find/i "%_svrc%"
')do set/a "_cnt+=1+0" && set "_str=%%~s" && call set "_base_!_cnt!=!_str:*%_svrc%=!"
if not defined _cnt (<con: echo=& echo\Serviço !_svrc! não foi encontrado em execução^!!
)else for /L %%i in (1 1 !_cnt!)do set "_b=00%%~i" && call echo\Base "!_b:~-2!": !_base_%%~i!
timeout.exe /t -1 & popd | endlocal & goto=:EOF
- Note: 1 For testing purposes I am replacing
OracleService
for Windows
, since I do not have this service in multiple occurrences being executed.
- 1. Without any manipulation by a loop
for
for the command:
sc query | find "_NAME:" | find /i "windows"
- The output returns this way:
DISPLAY_NAME: Windows Audio Endpoint Builder
DISPLAY_NAME: Windows Audio
DISPLAY_NAME: Windows Event Log
DISPLAY_NAME: Windows Font Cache Service
DISPLAY_NAME: Windows Presentation Foundation Font Cache 3.0.0.0
DISPLAY_NAME: Windows Phone IP over USB Transport (IpOverUsbSvc)
DISPLAY_NAME: Windows License Manager Service
DISPLAY_NAME: Windows Defender Firewall
DISPLAY_NAME: Windows Security Service
DISPLAY_NAME: Windows Image Acquisition (WIA)
DISPLAY_NAME: Windows Biometric Service
DISPLAY_NAME: Windows Connection Manager
DISPLAY_NAME: Windows Defender Antivirus Network Inspection Service
DISPLAY_NAME: Windows Defender Antivirus Service
DISPLAY_NAME: Windows Management Instrumentation
DISPLAY_NAME: Windows Push Notifications System Service
DISPLAY_NAME: Windows Search
DISPLAY_NAME: Windows Push Notifications User Service_6a4f9
- 2. Using a loop
for /f
and counting occurrences to concatenate its variable with the Udo of a counter (set /a "_cnt+=1+0"
), implemented in a way that allows saving each occurrence in a separate variable:
1º loop:
set _seu_contador=contador + 1 ⁄⁄ set /a _cnt=1+0 == set /a _cnt+=1+0
set _var_contador=1ª ocorrência ⁄⁄ set /a _var_1=ocorrência == set_var_!_cnt!=1ª ocorrência
2º loop:
set _seu_contador=contador + 1 ⁄⁄ set /a _cnt=1+1+0 == set /a _cnt+=1+0
set _var_contador=2ª ocorrência ⁄⁄ set /a _var_2=ocorrência == set_var_!_cnt!=2ª ocorrência
3º loop:
set _seu_contador=contador + 1 ⁄⁄ set /a _cnt=2+1+0 == set /a _cnt+=1+0
set _var_contador=3ª ocorrência ⁄⁄ set /a _var_3=ocorrência == set_var_!_cnt!=3ª ocorrência
⁄⁄ Obs.: Como a variável _cnt não foi definida antes
⁄⁄ do 1º loop/uso, use '+0': set /a _cnt+=1+0
- 3. The above actions will be (applied) in the processing that returns from the loop
For /F
by command sc query | find "_NAME:" | find /i "%_svrc%"
(item 1.), adding use of a set _var=substring(%_var:removeSstring=%)
to treat in the variable the value of the strings you want to remove/stay. In your case, remove everything that comes before Oracleservice and take everything that comes after, would:
set variavel=Remover Qualquer Strings Antes De OracleService Ficando Qualquer Strings Depois
set variavel=Remover Qualquer Strings Antes De OracleService
set variavel=%variavel:*OracleService=%
set variavel=o seu valor mas tudo ("*") antes de 'OracleService' substituir ("=") por nada ("=%")
set variavel=%variavel:*OracleService=%Ficando Qualquer Strings Depois
- 4. Using/applying for example in one of the names in the listing of Windows services, such as the
Windows Update
(see Note: 1), would result in Update
:
set variavel=%%~s
set variavel=Windows Update
set variavel=%variavel:*Windows`espaço!`=%
set variavel=%variavel:*Windows =%
set variavel=%variavel:*Windows Update
set variavel=Update
set "_svrc=Windows"
....
set "_str=Windows Update"
set "_base_!_cnt!=!_str:*Windows %=!" ⁄⁄ o mesmo que: set "_base_!_cnt!=Update"
set "_str=Windows Update"
set "_base_!_cnt!=!_str:*%_svrc%=!" ⁄⁄ o mesmo que: set "_base_!_cnt!=*Windows Update"
- 5. The same accountant
!_cnt!
incremented in the looping For /F
, you can use to Ober the list of occurrences setadas/definas, just make use of a loop For /L
, within a predefined numerical range for start value **1
, jump value **1
, and end/end value !_cnt!
, so that all occurrences/strings will be accessed in the same way they were defined, using concatenation:
For /L %%i in (1 1 !_cnt!)do... !_base_%%i!
⁄⁄ Existindo 3 ocorrências, o valor de !_cnt! será igual a 3, e loop
⁄⁄ ficaria entre 1 e 3, pulando de 1 em 1: For /L %%i in (1 1 3,)do...
For /L %%i in (1 1 !_cnt!)do... !_base_1! string na 1ª ocorrência/variável ⁄⁄ %%i == 1
do... !_base_2! string na 2ª ocorrência/variável ⁄⁄ %%i == 2
do... !_base_3! string na 3ª ocorrência/variável ⁄⁄ %%i == 3
For /L %%i in (1 1 !_cnt!)do... !_base_%%i! string na 1ª ocorrência/variável ⁄⁄ %%i == 1
do... !_base_%%i! string na 2ª ocorrência/variável ⁄⁄ %%i == 2
do... !_base_%%i! string na 3ª ocorrência/variável ⁄⁄ %%i == 3
- 6. For classification and comparison purposes only in test runs, a concatenation of two zeros added when defining
_b=%%i
(set _b=00%%i
), and in the listing it was possible to use 02
digits, when relating the output of the services found in their respective variables accessed by For /L
, getting in the list the bases with this layout Base 01
, instead of Base 01
:
)else for /L %%i in (1 1 !_cnt!)do set "_b=00%%~i" && call echo\Base "!_b:~-2!": !_base_%%~i!
- Remembering the replacement of
OracleService
for Windows
(vine Note: 1), and compare the Stings in the original loop output and the changes made with set string=substring
:
DISPLAY_NAME: Windows Audio Endpoint Builder
DISPLAY_NAME: Windows Audio
DISPLAY_NAME: Windows Event Log
DISPLAY_NAME: Windows Font Cache Service
DISPLAY_NAME: Windows Presentation Foundation Font Cache 3.0.0.0
DISPLAY_NAME: Windows Phone IP over USB Transport (IpOverUsbSvc)
DISPLAY_NAME: Windows License Manager Service
DISPLAY_NAME: Windows Defender Firewall
DISPLAY_NAME: Windows Security Service
DISPLAY_NAME: Windows Image Acquisition (WIA)
DISPLAY_NAME: Windows Biometric Service
DISPLAY_NAME: Windows Connection Manager
DISPLAY_NAME: Windows Defender Antivirus Network Inspection Service
DISPLAY_NAME: Windows Defender Antivirus Service
DISPLAY_NAME: Windows Management Instrumentation
DISPLAY_NAME: Windows Push Notifications System Service
DISPLAY_NAME: Windows Search
DISPLAY_NAME: Windows Push Notifications User Service_6a4f9
Base 01: Audio Endpoint Builder
Base 02: Audio
Base 03: Event Log
Base 04: Font Cache Service
Base 05: Presentation Foundation Font Cache 3.0.0.0
Base 06: Phone IP over USB Transport (IpOverUsbSvc)
Base 07: License Manager Service
Base 08: Defender Firewall
Base 09: Security Service
Base 10: Image Acquisition (WIA)
Base 11: Biometric Service
Base 12: Connection Manager
Base 13: Connect Now - Config Registrar
Base 14: Defender Antivirus Network Inspection Service
Base 15: Defender Antivirus Service
Base 16: Management Instrumentation
Base 17: Push Notifications System Service
Base 18: Search
Base 19: Update
Base 20: Push Notifications User Service_6a4f9
EDIT /*
- Get your
substring
in first occurrence of your looping:
@echo off
for /f "tokens=* delims= " %%s in ('sc query ^| find /i "OracleService"') do (
set "_var=%%~s"
set "_3d=%_var:~-3%"
goto :LABEL
)
:LABEL
echo\%_var%
echo\Nome da Base: %_3d%
- Compact and unused version "didactic layout" in the code:
@echo off && setLocal EnableDelayedExpansion
for /f tokens^=* %%s in ('
%__APPDIR__%sc.exe query^|find/i "OracleService"
')do set "_var=%%~s" && call set "_3d=!_var:~-3!" & goto :^v
:^v
echo\%_var% & echo\Nome da Base: %_3d% & endlocal & goto :EOF
- To get in the service name the base name and catch the last 3 characters
already saving that string
in a variable, only use :~-3
set !"_var=%%~s!"
set !"_3d=%_var:~-3%!"
rem :: ou...
')do set "_var=%%~s" & call set "_3d=!_var:~-3!" ⁄⁄ para uso na mesma linha⁄layout compacto
- To return only to first occurrence in looping, create a leak using a
:label
to get out of this looping in 1ª execução
already saving your substring
set !"_var=%%~s!"
set !"_3d=%_var:~-3%!"
goto :LABEL
rem :: ou...
')do set "_var=%%~s" & call set "_3d=!_var:~-3
set "_var=%%~s" & call set "_3d=!_var:~-3!" & goto :label ⁄⁄ para uso na mesma linha⁄layout compacto
Note: 3 |find/i 'OracleService' ⁄⁄ Use 'case-insensitive == /i' no seu 'find'
Only use the literal name when you are sure that the string has only occurrences with this layout, otherwise consider that string
may differ (containing uppercase/lowercase only or other unforeseeable variations) from the layout currently in presumed use in its code bat
- Get your
substring
in last occurrence of your looping:
@echo off && Setlocal EnableDelayedExpansion
for /f %%i in ('sc query ^| find /i "OracleService" ^| find /v /c ""') do (
if /i %%~i gtr 2 (
call set /a "_x=%%i-1"
for /f "tokens=* delims= " %%s in ('sc query ^| find /i "OracleService" ^| more /s +!_x!') do (
set "_var=%%~s"
call set "_3d=!_var:~-3!"
)
) else if %%~i equ 1 (
for /f tokens^=* %%s in ('sc query ^| find /i "OracleService"') do (
set "_var=%%~s"
call set "_3d=!_var:~-3!"
)
) else (
echo\Servico OracleService nao foi encontrado em execucao
timeout /t -1
goto :EOF
)
)
)
echo\%_var% && echo\%_3d% & endlocal & goto :EOF
- Compact version without the use of "didactic layout" in the code:
@echo off && setLocal EnableDelayedExpansion
for /f %%i in ('%__APPDIR__%sc.exe query^|find/i "OracleService"^|find/v /c ""')do if %%~i gtr 2 (
call set /a "_x=%%i-1" && for /f tokens^=* %%s in ('%__APPDIR__%sc.exe query^|find/i "OracleService"^|%__APPDIR__%more.com /s +!_x!
')do set "_var=%%~s" && call set "_3d=!_var:~-3!" ) else if %%~i equ 1 (for /f tokens^=* %%s in ('%__APPDIR__%sc.exe query^|find/i "OracleService"
')do set "_var=%%~s" && call set "_3d=!_var:~-3!" ) else echo\Servico OracleService nao encontrado em execucao^^!! & %__APPDIR__%timeout.exe -1 & endlocal & goto :EOF
echo\%_var% && echo\Nome da base: %_3d% & endlocal & goto :EOF
- To obtain the last occurrence it will be necessary to count and operate on
total (ocorrências) -1
, where what will matter is:
Se Total ≥ 2 ⁄⁄ pular na listagem Total - 1
Se Total = 1 ⁄⁄ apenas usar mais ações não são necessárias
Se Total = 0 ⁄⁄ informar serviço não encontrado
Note: 4 You probably don’t need anything in the additional information from state^=all
.
for /f %%i in ('sc query state^=all^| find /i "OracleService" ^| find /v /c ""') do ...