wmic terminate process not found - windows

wmic process where name="abc.exe" call terminate
Sometimes I got the below error:
Description = Not Found
I suspect that this is because abc.exe is not running. Is this the case? If yes, is there a way to check if abc.exe is running before calling terminate?

Here is a batch example for killing any instances of Google Chrome using CommandLine with WMIC.
#echo off
Title BATCH Killing Program using CommandLine with WMIC
Set MyProgramPath=C:\Program Files\Google\Chrome\Application\chrome.exe
#for %%a in ("%MyProgramPath%") do set "MyProgramName=%%~nxa"
Set MyProgramPath=%MyProgramPath:\=\\%
set idx=0
:MAIN
cls
echo( Looking for any instances of "%MyProgramName%" ...
Set "Found="
SETLOCAL EnableDelayedExpansion
#for /f "Tokens=2 Delims==" %%a in ('wmic PROCESS where "CommandLine Like '%%%MyProgramPath%%%' And Name Like '%%%MyProgramName%%%'" get ProcessID /Value') do (
#for /f "delims=" %%b in ("%%a") do (
Set /a idx+=1
set "MyPID[!idx!]=%%~nb"
set "Found=True"
)
)
If /I [!Found!] EQU [True] (
echo( We found PID for "%MyProgramName%"
#for /l %%i in (1,1,!idx!) do echo( %%i - !MyPID[%%i]!
echo( Did you want to Kill this program "%MyProgramName%" [Y=YES]
Set /P "Answer="
IF /I [!Answer!] EQU [Y] (
#for /l %%i in (1,1,!idx!) do Taskkill /T /F /PID !MyPID[%%i]!
) else (
Endlocal
Timeout /T 1 /NoBreak>nul
Goto Main
)
) else (
Timeout /T 10 /NoBreak>nul
Goto Main
)

Related

Filter results in batch script for user printer selection

I am trying to create a script to allow users to temporarily set the default windows printer to a selected printer (PDF, XPS, OneNote) before printing and then automatically set the default back to the original printer after a specified time.
I have managed to incorporate elements of many different examples to get to the stage where the script is functioning, although it is creating an extra entry at the start and end of the list.
I would like to filter the list of printers the user is shown to just ones from the appropriate list (e.g. PDF, XPS, OneNote).
Any help would be greatly appreciated.
#echo off
setlocal enableDelayedExpansion
FOR /F "tokens=2* delims==" %%A in (
'wmic printer where "default=True" get name /value'
) do SET DefaultPrinter=%%A
ECHO.
ECHO ==============================================================
ECHO Current Default Printer
ECHO ==============================================================
ECHO.
ECHO Default Printer = %DefaultPrinter%
ECHO.
pause
Cls
ECHO ==============================================================
ECHO Processing locally installed printers
ECHO ==============================================================
::build "array" of printers
set printerCnt=0
for /f "eol=: delims=" %%F in ('wmic printer get Name') do (
set /a printerCnt+=1
set "printer!printerCnt!=%%F"
)
::print menu
for /l %%N in (1 1 %printerCnt%) do echo %%N - !printer%%N!
echo(
:get selection
set selection=
set /p "selection=Enter a printer number: "
echo You picked !printer%selection%!
set NewPrinter=!printer%selection%!
::trim selection
set str=%NewPrinter%
for /l %%a in (1,1,31) do if "!str:~-1!"==" " set str=!str:~0,-1!
RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "%str%"
TIMEOUT 10
RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "%DefaultPrinter%"
[Edit /]
I have included the code I ended up using. This was based on the answer provided by #Hackoo and I incorporated elements provided by #Magoo also. There is probably a more elegant way to write this code but I am new to this so laid it out as I understood it.
#echo off
Mode 70,30 & color F0
Title Healthmail Printer Selection
FOR /F "tokens=2* delims==" %%A in (
'wmic printer where "default=True" get name /value'
) do SET "DefaultPrinter=%%A"
ECHO.
ECHO ==============================================================
ECHO Current Default Printer
ECHO ==============================================================
ECHO.
ECHO Default Printer = [%DefaultPrinter%]
ECHO.
TIMEOUT /T 2 /NoBreak>nul
Cls
ECHO.
ECHO ==============================================================
ECHO Available Printers
ECHO ==============================================================
Setlocal EnableDelayedExpansion
::build "array" of printers
Set "FilterList=%Temp%\FilterList.txt"
REM Create a file to filter just for PDF printers
>"%FilterList%" (
echo PDF
)
set printerCnt=0
#for /f "delims=" %%a in (
'wmic printer get Name ^|findstr /G:%FilterList%"'
) do (
#for /f "delims=" %%b in ("%%a") do (
set /a printerCnt+=1
set "printer!printerCnt!=%%~nb"
)
)
::If no printers have been found, go to filterlistlong
:zerofilterprinters
IF !printerCnt!==0 GOTO :filterlistlong
IF !printerCnt! gtr 0 GOTO :printmenu
:filterlistlong
Set "FilterListLong=%Temp%\FilterListLong.txt"
REM Create a file to filter with each word like XPS,OneNote and PDF
>"%FilterListLong%" (
echo PDF
echo XPS
echo OneNote
)
set printerCnt=0
#for /f "delims=" %%a in (
'wmic printer get Name ^|findstr /G:%FilterListLong%"'
) do (
#for /f "delims=" %%b in ("%%a") do (
set /a printerCnt+=1
set "printer!printerCnt!=%%~nb"
)
)
:printmenu
SET "choices="
for /l %%N in (1 1 %printerCnt%) do SET "choices=!choices!%%N"&SET "printer%%N=!printer%%N!"&IF %printercnt% gtr 1 echo %%N - !printer%%N!
echo(
:get selection
:: If no available options, exit
IF NOT DEFINED choices GOTO :EOF
:: If only 1 option, auto-select that
IF %choices%==1 SET /a selection=1&GOTO autoselect
choice /c %choices% /m "Enter a printer number: "
set selection=%ERRORLEVEL%
:: Error condition
IF %selection% gtr %printercnt% GOTO :EOF
:: Control-C
IF %selection% equ 0 GOTO :EOF
cls
ECHO ==============================================================
ECHO You selected: !printer%selection%!
ECHO ==============================================================
echo.
echo. Please proceed to print document.
echo.
echo. This window will close automatically in 30 seconds.
::GOTO :setprinter
:autoselect
set NewPrinter=!printer%selection%!
cls
ECHO ==============================================================
ECHO Printer selected: !printer%selection%!
ECHO ==============================================================
echo.
echo. Please proceed to print document.
echo.
echo. This window will close automatically in 10 seconds.
:setprinter
RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "%NewPrinter%"
TIMEOUT /T 10 /nobreak > NUL
RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "%DefaultPrinter%"
GOTO :EOF
If Exist "%FilterList%" Del "%FilterList%"
If Exist "%FilterListLong%" Del "%FilterListLong%"
The output of WMIC is unicode !
The trailing <CR> can be removed by passing the value through another FOR /F loop.
This also removes the phantom "blank" line (actually a <CR>) and in this case you don't need to use the Trim function !
#echo off
Mode 70,30 & color 0A
Title Filter results in batch script for user printer selection
FOR /F "tokens=2* delims==" %%A in (
'wmic printer where "default=True" get name /value'
) do SET "DefaultPrinter=%%A"
ECHO.
ECHO ==============================================================
ECHO Current Default Printer
ECHO ==============================================================
ECHO.
ECHO Default Printer = [%DefaultPrinter%]
ECHO.
TIMEOUT /T 3 /NoBreak>nul
Cls
ECHO.
ECHO ==============================================================
ECHO Processing locally installed printers
ECHO ==============================================================
Setlocal EnableDelayedExpansion
::build "array" of printers
REM We Ignore printer begin with Micro or Fax in the name
Set "FilterList=%Temp%\FilterList.txt"
REM We create a file to filter with each word like XPS,OneNote and PDF
>"%FilterList%" (
echo XPS
echo OneNote
echo PDF
)
set printerCnt=0
#for /f "skip=1 delims=" %%a in (
'wmic printer get Name ^|findstr /G:%FilterList%"'
) do (
#for /f "delims=" %%b in ("%%a") do (
set /a printerCnt+=1
set "printer!printerCnt!=%%~nb"
)
)
::print menu
for /l %%N in (1 1 %printerCnt%) do echo [%%N] - [!printer%%N!]
echo ==============================================================
:get selection
set selection=
set /p "selection=Enter a printer number: "
set "NewPrinter=!printer%selection%!"
echo. You picked [%NewPrinter%]
RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "%NewPrinter%"
TIMEOUT /T 10
RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "%DefaultPrinter%"
If Exist "%FilterList%" Del "%FilterList%"
#echo off
setlocal ENABLEDELAYEDEXPANSION
SET "printfilter=%1"
FOR /F "tokens=2* delims==" %%A in (
'wmic printer where "default=True" get name /value'
) do SET DefaultPrinter=%%A
ECHO.
ECHO ==============================================================
ECHO Current Default Printer
ECHO ==============================================================
ECHO.
ECHO Default Printer = %DefaultPrinter%
ECHO.
pause
Cls
ECHO ==============================================================
ECHO Processing locally installed printers
ECHO ==============================================================
::build "array" of printers
set printerCnt=0
for /f "skip=1eol=: delims=" %%F in ('wmic printer get Name') do (
set /a printerCnt+=1
set "printer!printerCnt!=%%F"
IF DEFINED printfilter ECHO %%F|FIND /i "%printfilter%" >nul&IF ERRORLEVEL 1 SET /a printercnt-=1
)
iF NOT DEFINED printfilter (
set "printer%printerCnt%="
SET /a printercnt-=1
)
::print menu
SET "choices="
for /l %%N in (1 1 %printerCnt%) do SET "choices=!choices!%%N"&SET "printer%%N=!printer%%N:~0,-1!"&IF %printercnt% gtr 1 echo %%N - !printer%%N!
echo(
:get selection
:: If no available options, exit
IF NOT DEFINED choices GOTO :EOF
:: If only 1 option, auto-select that
IF %choices%==1 SET /a selection=1&GOTO autoselect
choice /c %choices% /m "Enter a printer number: "
set selection=%ERRORLEVEL%
:: Error condition
IF %selection% gtr %printercnt% GOTO :EOF
:: Control-C
IF %selection% equ 0 GOTO :EOF
echo You picked !printer%selection%!
:autoselect
set NewPrinter=!printer%selection%!
::trim selection
set str=%NewPrinter%
for /l %%a in (1,1,31) do if "!str:~-1!"==" " set str=!str:~0,-1!
ECHO RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "%str%"
ECHO TIMEOUT 10
ECHO RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "%DefaultPrinter%"
GOTO :EOF
Amusing...
First, to specify the filter, simply append an appropriate string (PDF, XPS, OneNote) to the batchname as a parameter. Omitting this selects ALL.
First step is to add the skip=1 to the for /f ... %%F... so that the Name line from the report is skipped.
Next, if the filter is invoked, detect whether the printername includes the filter string. If it does NOT, then back up the printer-counter.
Having built the array, noting that the last (bogus) entry will have been recorded UNLESS the filter is invoked, clear the last (bogus) entry and back up the counter.
The point with WMIC output is that it's not only Unicode, but it has a line-terminator of <CR><CR><LF> instead of <CR><LF>. The text values stored in the array each have a terminal <CR>. Hence the bogus last entry.
So, for each entry passing the filter, build a string of the options allowed into choices, and remove the last character from the printer name string and show it.
Now if there are no choices, exit (or something else).
If there's only one choice, auto-select it (and don't show the selection-list) Otherwise use choice to select the printers from the list.
You'd need to add to the list of choices to allow selection of printers beyond #9.
and I chose to simply echo the rundll32s and timeout for testing.
I'd just enumerate the printers once, and get rid of much of the unnecessary screen output:
#Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "SysDir=%SystemRoot%\System32"
For /F "Delims==" %%G In ('"(Set Printer[) 2>NUL"') Do Set "%%G="
Set "DefaultPrinter="
For /F "Tokens=1-3,* Delims=[,]" %%G In ('%SysDir%\wbem\WMIC.exe Printer Get
Default^, Name /Format:CSV 2^>NUL ^| %SysDir%\findstr.exe "E\>" ^|
%SysDir%\find.exe /V /N ""') Do For /F "Tokens=*" %%K In ("%%J") Do (
Echo([%%G] %%K
If "%%I" == "TRUE" Set "DefaultPrinter=%%K"
Set "Printer[%%G]=%%K")
If Not Defined Printer[1] (Echo No printers found.
Echo Press any key to end . . .
GoTo :EOF)
Echo(
(Set DefaultPrinter) 2>NUL || Echo No default printer found.
:Selection
Echo(
Set "UserPrinter="
Set /P "UserPrinter=Enter the number for your preferred printer>"
Set "UserPrinter=%UserPrinter:"=%"
Set Printer[ | %SysDir%\findstr.exe /B /L "Printer[%UserPrinter%]=" 1>NUL || (
GoTo Selection)
SetLocal EnableDelayedExpansion
For %%G In ("!Printer[%UserPrinter%]!") Do EndLocal & Set "UserPrinter=%%~G"
Echo(
Echo You Selected %UserPrinter%
%SysDir%\timeout.exe /T 3 /NoBreak 1>NUL
%SysDir%\rundll32.exe %SysDir%\printui.dll,PrintUIEntry /y /n "%UserPrinter%"
%SysDir%\timeout.exe /T 10
%SysDir%\rundll32.exe %SysDir%\printui.dll,PrintUIEntry /y /n "%DefaultPrinter%"
[EDIT /]
If you really do need to support windows-7, and windows-server-2008-r2, and you cannot guarantee that the XSL files have been copied up a level on the target machine, then it should still possible. Although it looks like a lot of extra lines, the following example should not seriously impact your script speed, other than the extra call to the relatively slow WMIC.exe, (your example, as well as the other currently submitted answers, already use more than one WMIC command).
#Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "SysDir=%SystemRoot%\System32"
%SysDir%\wbem\WMIC.exe OS Where "Version Like '6.1%%'" Get Version 2>NUL ^
| %SysDir%\find.exe "6.1" 1>NUL && Call :GetXSLDir
For /F "Delims==" %%G In ('"(Set Printer[) 2>NUL"') Do Set "%%G="
Set "DefaultPrinter="
For /F "Tokens=1-3,* Delims=[,]" %%G In ('%SysDir%\wbem\WMIC.exe Printer Get
Default^, Name /Format:"%XSLDir%csv.xsl" 2^>NUL ^| %SysDir%\findstr.exe "E\>"
^| %SysDir%\find.exe /V /N ""') Do For /F "Tokens=*" %%K In ("%%J") Do (
Echo([%%G] %%K
If "%%I" == "TRUE" Set "DefaultPrinter=%%K"
Set "Printer[%%G]=%%K")
If Not Defined Printer[1] (Echo No printers found.
Echo Press any key to end . . .
GoTo :EOF)
Echo(
(Set DefaultPrinter) 2>NUL || Echo No default printer found.
:Selection
Echo(
Set "UserPrinter="
Set /P "UserPrinter=Enter the number for your preferred printer>"
Set "UserPrinter=%UserPrinter:"=%"
Set Printer[ | %SysDir%\findstr.exe /B /L "Printer[%UserPrinter%]=" 1>NUL || (
GoTo Selection)
SetLocal EnableDelayedExpansion
For %%G In ("!Printer[%UserPrinter%]!") Do EndLocal & Set "UserPrinter=%%~G"
Echo(
Echo You Selected %UserPrinter%
%SysDir%\timeout.exe /T 3 /NoBreak 1>NUL
%SysDir%\rundll32.exe %SysDir%\printui.dll,PrintUIEntry /y /n "%UserPrinter%"
%SysDir%\timeout.exe /T 10
%SysDir%\rundll32.exe %SysDir%\printui.dll,PrintUIEntry /y /n "%DefaultPrinter%"
GoTo :EOF
:GetXSLDir
For %%G In (Default InstallLanguage XSLDir) Do Set "%%G="
For /F "Tokens=1,2*" %%G In ('%SysDir%\reg.exe Query
HKLM\System\CurrentControlSet\Control\Nls\Language 2^>NUL ^|
%SysDir%\findstr.exe /I "\<Default\> \<InstallLanguage\>"'
) Do For /F "Tokens=2 Delims=:" %%J In ('%SysDir%\findstr.exe "::%%I:" "%~f0"'
) Do Set "%%G=%%J"
If Exist "%SysDir%\wbem\%Default%\*.xsl" (Set "XSLDir=%SysDir%\wbem\%Default%\"
) Else If Exist "%SysDir%\wbem\%InstallLanguage%\*.xsl" (
Set "XSLDir=%SysDir%\wbem\%InstallLanguage%\")
For %%G In (Default InstallLanguage) Do Set "%%G="
Exit /B
::0001:ar
::0002:bg
::0003:ca
::0004:zh-Hans
::0005:cs
::0006:da
::0007:de
::0008:el
::0009:en
::000A:es
::000B:fi
::000C:fr
::000D:he
::000E:hu
::000F:is
::0010:it
::0011:ja
::0012:ko
::0013:nl
::0014:no
::0015:pl
::0016:pt
::0017:rm
::0018:ro
::0019:ru
::001A:hr
::001B:sk
::001C:sq
::001D:sv
::001E:th
::001F:tr
::0020:ur
::0021:id
::0022:uk
::0023:be
::0024:sl
::0025:et
::0026:lv
::0027:lt
::0028:tg
::0029:fa
::002A:vi
::002B:hy
::002C:az
::002D:eu
::002E:hsb
::002F:mk
::0030:st
::0031:ts
::0032:tn
::0033:ve
::0034:xh
::0035:zu
::0036:af
::0037:ka
::0038:fo
::0039:hi
::003A:mt
::003B:se
::003C:ga
::003D:yi
::003E:ms
::003F:kk
::0040:ky
::0041:sw
::0042:tk
::0043:uz
::0044:tt
::0045:bn
::0046:pa
::0047:gu
::0048:or
::0049:ta
::004A:te
::004B:kn
::004C:ml
::004D:as
::004E:mr
::004F:sa
::0050:mn
::0051:bo
::0052:cy
::0053:km
::0054:lo
::0055:my
::0056:gl
::0057:kok
::0058:mni
::0059:sd
::005A:syr
::005B:si
::005C:chr
::005D:iu
::005E:am
::005F:tzm
::0060:ks
::0061:ne
::0062:fy
::0063:ps
::0064:fil
::0065:dv
::0066:bin
::0067:ff
::0068:ha
::0069:ibb
::006A:yo
::006B:quz
::006C:nso
::006D:ba
::006E:lb
::006F:kl
::0070:ig
::0071:kr
::0072:om
::0073:ti
::0074:gn
::0075:haw
::0076:la
::0077:so
::0078:ii
::0079:pap
::007A:arn
::007C:moh
::007E:br
::0080:ug
::0081:mi
::0082:oc
::0083:co
::0084:gsw
::0085:sah
::0086:qut
::0087:rw
::0088:wo
::008C:prs
::0091:gd
::0092:ku
::0093:quc
::0401:ar-SA
::0402:bg-BG
::0403:ca-ES
::0404:zh-TW
::0405:cs-CZ
::0406:da-DK
::0407:de-DE
::0408:el-GR
::0409:en-US
::040A:es-ES_tradnl
::040B:fi-FI
::040C:fr-FR
::040D:he-IL
::040E:hu-HU
::040F:is-IS
::0410:it-IT
::0411:ja-JP
::0412:ko-KR
::0413:nl-NL
::0414:nb-NO
::0415:pl-PL
::0416:pt-BR
::0417:rm-CH
::0418:ro-RO
::0419:ru-RU
::041A:hr-HR
::041B:sk-SK
::041C:sq-AL
::041D:sv-SE
::041E:th-TH
::041F:tr-TR
::0420:ur-PK
::0421:id-ID
::0422:uk-UA
::0423:be-BY
::0424:sl-SI
::0425:et-EE
::0426:lv-LV
::0427:lt-LT
::0428:tg-Cyrl-TJ
::0429:fa-IR
::042A:vi-VN
::042B:hy-AM
::042C:az-Latn-AZ
::042D:eu-ES
::042E:hsb-DE
::042F:mk-MK
::0430:st-ZA
::0431:ts-ZA
::0432:tn-ZA
::0433:ve-ZA
::0434:xh-ZA
::0435:zu-ZA
::0436:af-ZA
::0437:ka-GE
::0438:fo-FO
::0439:hi-IN
::043A:mt-MT
::043B:se-NO
::043D:yi-Hebr
::043E:ms-MY
::043F:kk-KZ
::0440:ky-KG
::0441:sw-KE
::0442:tk-TM
::0443:uz-Latn-UZ
::0444:tt-RU
::0445:bn-IN
::0446:pa-IN
::0447:gu-IN
::0448:or-IN
::0449:ta-IN
::044A:te-IN
::044B:kn-IN
::044C:ml-IN
::044D:as-IN
::044E:mr-IN
::044F:sa-IN
::0450:mn-MN
::0451:bo-CN
::0452:cy-GB
::0453:km-KH
::0454:lo-LA
::0455:my-MM
::0456:gl-ES
::0457:kok-IN
::0458:mni-IN
::0459:sd-Deva-IN
::045A:syr-SY
::045B:si-LK
::045C:chr-Cher-US
::045D:iu-Cans-CA
::045E:am-ET
::045F:tzm-Arab-MA
::0460:ks-Arab
::0461:ne-NP
::0462:fy-NL
::0463:ps-AF
::0464:fil-PH
::0465:dv-MV
::0466:bin-NG
::0467:fuv-NG
::0468:ha-Latn-NG
::0469:ibb-NG
::046A:yo-NG
::046B:quz-BO
::046C:nso-ZA
::046D:ba-RU
::046E:lb-LU
::046F:kl-GL
::0470:ig-NG
::0471:kr-NG
::0472:om-ET
::0473:ti-ET
::0474:gn-PY
::0475:haw-US
::0476:la-Latn
::0477:so-SO
::0478:ii-CN
::0479:pap-029
::047A:arn-CL
::047C:moh-CA
::047E:br-FR
::0480:ug-CN
::0481:mi-NZ
::0482:oc-FR
::0483:co-FR
::0484:gsw-FR
::0485:sah-RU
::0486:qut-GT
::0487:rw-RW
::0488:wo-SN
::048C:prs-AF
::048D:plt-MG
::048E:zh-yue-HK
::048F:tdd-Tale-CN
::0490:khb-Talu-CN
::0491:gd-GB
::0492:ku-Arab-IQ
::0493:quc-CO
::0501:qps-ploc
::05FE:qps-ploca
::0801:ar-IQ
::0803:ca-ES-valencia
::0804:zh-CN
::0807:de-CH
::0809:en-GB
::080A:es-MX
::080C:fr-BE
::0810:it-CH
::0811:ja-Ploc-JP
::0813:nl-BE
::0814:nn-NO
::0816:pt-PT
::0818:ro-MD
::0819:ru-MD
::081A:sr-Latn-CS
::081D:sv-FI
::0820:ur-IN
::082C:az-Cyrl-AZ
::082E:dsb-DE
::0832:tn-BW
::083B:se-SE
::083C:ga-IE
::083E:ms-BN
::083F:kk-Latn-KZ
::0843:uz-Cyrl-UZ
::0845:bn-BD
::0846:pa-Arab-PK
::0849:ta-LK
::0850:mn-Mong-CN
::0851:bo-BT
::0859:sd-Arab-PK
::085D:iu-Latn-CA
::085F:tzm-Latn-DZ
::0860:ks-Deva
::0861:ne-IN
::0867:ff-Latn-SN
::086B:quz-EC
::0873:ti-ER
::09FF:qps-plocm
::0C01:ar-EG
::0C04:zh-HK
::0C07:de-AT
::0C09:en-AU
::0C0A:es-ES
::0C0C:fr-CA
::0C1A:sr-Cyrl-CS
::0C3B:se-FI
::0C50:mn-Mong-MN
::0C51:dz-BT
::0C5F:tmz-MA
::0C6b:quz-PE
::1001:ar-LY
::1004:zh-SG
::1007:de-LU
::1009:en-CA
::100A:es-GT
::100C:fr-CH
::101A:hr-BA
::103B:smj-NO
::105F:tzm-Tfng-MA
::1401:ar-DZ
::1404:zh-MO
::1407:de-LI
::1409:en-NZ
::140A:es-CR
::140C:fr-LU
::141A:bs-Latn-BA
::143B:smj-SE
::1801:ar-MA
::1809:en-IE
::180A:es-PA
::180C:fr-MC
::181A:sr-Latn-BA
::183B:sma-NO
::1C01:ar-TN
::1C09:en-ZA
::1C0A:es-DO
::1C1A:sr-Cyrl-BA
::1C3B:sma-SE
::2001:ar-OM
::2009:en-JM
::200A:es-VE
::200C:fr-RE
::201A:bs-Cyrl-BA
::203B:sms-FI
::2401:ar-YE
::2409:en-029
::240A:es-CO
::240C:fr-CD
::241A:sr-Latn-RS
::243B:smn-FI
::2801:ar-SY
::2809:en-BZ
::280A:es-PE
::280C:fr-SN
::281A:sr-Cyrl-RS
::2C01:ar-JO
::2C09:en-TT
::2C0A:es-AR
::2C0C:fr-CM
::2C1A:sr-Latn-ME
::3001:ar-LB
::3009:en-ZW
::300A:es-EC
::300C:fr-CI
::301A:sr-Cyrl-ME
::3401:ar-KW
::3409:en-PH
::340A:es-CL
::340C:fr-ML
::3801:ar-AE
::3809:en-ID
::380A:es-UY
::380C:fr-MA
::3c01:ar-BH
::3c09:en-HK
::3c0A:es-PY
::3c0C:fr-HT
::4001:ar-QA
::4009:en-IN
::400A:es-BO
::4401:ar-Ploc-SA
::4409:en-MY
::440A:es-SV
::4801:ar-145
::4809:en-SG
::480A:es-HN
::4C09:en-AE
::4C0A:es-NI
::5009:en-BH
::500A:es-PR
::5409:en-EG
::540A:es-US
::5809:en-JO
::580A:es-419
::5C09:en-KW
::5C0A:es-CU
::6009:en-TR
::6409:en-YE
::641A:bs-Cyrl
::681A:bs-Latn
::6C1A:sr-Cyrl
::701A:sr-Latn
::703B:smn
::742C:az-Cyrl
::743B:sms
::7804:zh
::7814:nn
::781A:bs
::782C:az-Latn
::783B:sma
::783F:kk-Cyrl
::7843:uz-Cyrl
::7850:mn-Cyrl
::785D:iu-Cans
::785F:tzm-Tfng
::7C04:zh-Hant
::7C14:nb
::7C1A:sr
::7C28:tg-Cyrl
::7C2E:dsb
::7C3B:smj
::7C3F:kk-Latn
::7C43:uz-Latn
::7C46:pa-Arab
::7C50:mn-Mong
::7C59:sd-Arab
::7C5C:chr-Cher
::7C5D:iu-Latn
::7C5F:tzm-Latn
::7C67:ff-Latn
::7C68:ha-Latn
::7C92:ku-Arab
::E40C:fr-015

How to remove names from a list in batch

I'm using windows bath, I have a list of names that I can add to but I don't know how to remove a name from the list.
So far my code is:
#echo off
setlocal enabledelayedexpansion
set allchoices=123456789
set "names=Bob,Steven,Harry"
set amount=6 ::max limit of list
set list=0
:start
::echoes a list of all names in the list
for /l %%i in (1; 1; %amount%) do (
call :sub %%i
)
goto check
:sub
for /f "tokens=%1 delims=," %%a in ("%names%") do (
echo %%i. %%a
set /a list=list+1
)
goto :eof
:check
::Remove a name from the list
choice /c !allchoices:~0,%list%! /m "What name do you want to remove?"
if errorlevel 3 (
for /f "tokens=3 delims=," %%a in ("%names%") do (
echo you have choosen to remove %%a
::remove third name in the list
goto start
)
)
if errorlevel 2 ::remove second name in the list
if errorlevel 1 ::remove first name in the list
I've tried using del but that turns out to delete a file in your folder.
I've tried renaming a specific name using set name[%%a]="" but that did nothing.
Any ideas?
Have a look at this example. There are many ways.
#echo off
setlocal enabledelayedexpansion
set names="Bob","Steven","Harry"
for %%i in (%names%) do (
set /a num+=1
set "!num!=%%~i"
)
for /l %%a in (1,1,%num%) do (
set choices=!choices!%%a
echo !num!.!%%a!
)
choice /c 123 /m "please select name to remove"
for /l %%a in (1,1,%num%) do if not "!%%a!"=="!%errorlevel%!" set new_names=!new_names! !%%~a!
echo %new_names:~1%
It can be done without the last for loop as well.. but I opted for it.
Here is some example code, for you to run, and then try to comprehend, I hope it helps rather than confuses:
#Echo Off
SetLocal EnableDelayedExpansion
For /F "Delims==" %%A In ('Set # 2^>NUL') Do Set "%%A="
Set "i=0"
For /F "Delims=:" %%A In ('FindStr "^::" "%~f0" 2^>NUL') Do (
Set /A i+=1
Set "#!i!=%%A"
Echo= !i!. %%A
)
:Ask
Set # 1>NUL 2>&1
If ErrorLevel 1 Echo= Empty names list&Timeout 3 1>NUL&Exit /B
Echo=&Set /P "Option= Choose a name to remove>"
Set #|Findstr "^#%Option%=" 1>NUL||GoTo :Ask
Set "Name=!#%Option%!"
Echo= You've chosen to remove "%Name%"
Timeout 2 1>NUL
Set "#%Option%="
ClS
For /F "Tokens=1*Delims=#=" %%A In ('Set # 2^>NUL') Do Echo= %%A. %%B
GoTo Ask
::Alan
::Beth
::Cleo
::Dale
::Eric
::Faye
::Greg
::Hugh
::Inga
Important note:Please ensure, before saving the above content as a Windows Command Script, that there is a line return, (blank line), at the end.

Running a cmd .bat file with loops and conditions

Hi I am trying to run a scrapy spider using start command from a cmd batch file. I want to run the spider parallely for 10 names from a csv file which contains more than 500 names. So my thought is to basically add some conditions in the loop from 1 to 500 that checks if the 10 command windows have closed, if not then wait for them to close (they auto close after spider is finished). Once the 10 windows which had opened, are closed, open the next 10 and so on. Following is the code I have, i am pretty sure it has big syntax errors. Could you help me debug? Thanks
cd /d "C:\Users\xyz"
for /f "tokens=1,*" %%m in ('tasklist ^| find /I /C "conhost.exe"') do (set var1=%%m)
set counter=1
for /f "usebackq tokens=1 delims=," %%n in ("test.csv") do (
(START /MIN "" scrapy crawl xyz_scraper -a query="%%n" -a pages=20)
set /a counter=counter+1
for /f "tokens=1,*" %%p in ('tasklist ^| find /I /C "conhost.exe"') do (set var2=%%p)
SET /A _result=counter%%10
echo %_result%
IF _result EQU 0 (
:abcd
timeout /t 10
if var2 EQU var1 (
goto bcde
)
ELSE (
goto abcd)
)
:bcde
)
pause
EDIT: deleted the for loop one. Edited the above code based on some suggestions. I don't understand where would i use quotes for variables and where not and how to print a variables value to cmd.
The updated code below:
cd /d "C:\Users\sodhian\sodhi-scraper"
for /f "tokens=1,*" %%m in ('tasklist ^| find /I /C "conhost.exe"') do (set var1=%%m)
echo %var1%
set counter=1
for /f "usebackq tokens=1 delims=," %%n in ("test comp.csv") do (
(START /MIN "" scrapy crawl ind_scraper -a query="%%n" -a pages=20)
set /a "counter=counter+1"
echo %counter%
SET /A _result="counter%%2"
echo %_result%
IF "%_result%" EQU "0" (
:abcd
timeout /t 10
for /f "tokens=1,*" %%p in ('tasklist ^| find /I /C "conhost.exe"') do (set var2=%%p)
echo %var2%
if var2==var1 (
goto bcde
)
ELSE (
goto abcd)
)
:bcde
)
pause
Edit 2:
Based on Stephan's answer. Tried to accomplish what i mentioned in comment of the answer:
setlocal enabledelayedexpansion
set counter=0
for /f "usebackq tokens=1 delims=," %%n in ("test comp.csv") do (
set /a counter+=1
start /MIN "MySpider!counter!" scrapy crawl ind_scraper -a query="%%n" -a pages=20
for /f "tokens=1,*" %%b in ('tasklist /v ^| find /I /C "MySpider"') do (set var1=%%b)
if !var1! geq 5 call :wait
)
:wait
timeout /t 5
for /f "tokens=1,*" %%p in ('tasklist /v ^| find /I /C "MySpider"') do (set var2=%%p)
if !var2! geq 5 call :wait
goto :eof
Changed it to the following: (the /v (verbose option in tasklist was making the above slow)
setlocal enabledelayedexpansion
set counter=0
set max_scrappers=7
for /f "tokens=1,*" %%a in ('tasklist ^| find /C "conhost"') do (set var1=%%a)
for /f "usebackq tokens=1 delims=," %%n in ("test comp.csv") do (
set /a counter+=1
start /min "MySpider!counter!" scrapy crawl ind_scraper -a query="%%n" -a pages=20
for /f "tokens=1,*" %%b in ('tasklist ^| find /C "conhost"') do (set var2=%%b)
set /a var3=!var2!-!var1!
if !var3! geq !max_scrappers! call :wait
)
:wait
for /f "tokens=1,*" %%p in ('tasklist ^| find /C "conhost"') do (set var4=%%p)
set /a var5=!var4!-!var1!
if !var5! geq !max_scrappers! call :wait
goto :eof
As already noted in the comments, labels inside a code block don't work. But you can call a "function", where goto and labels are no problem:
I choosed other numbers and another command to make it work on every system (and faster). Replacing the timeout command with your spider and adapting the numbers should be no problem.
#echo off
setlocal enabledelayedexpansion
REM next line just for generating a testfile:
>"test comp.csv" (for /l %%i in (1,1,10) do echo !random:~-1!)
set counter=0
for /f "usebackq tokens=1 delims=," %%n in ("test comp.csv") do (
set /a counter+=1
start "MySpider!counter!" timeout %%n
if !counter! geq 3 call :wait
)
:wait
tasklist /v|find "MySpider">nul && goto :wait
set counter=0
goto :eof
Searching for conhost is not a good idea, because there could be other processes. Choose an unique window title instead (MySpider in my example) and look for that title (tasklist /v)

Is there any way to remove the entries with same process names?

I'm trying to get the top 10 memory consuming processes and I am using the code provided as an answer in this Question. It works fine except that I don't want multiple entries of processes consuming different memory size and I was unable to sort it because it's memory consumption is different.
The code is:
#echo off
setlocal EnableDelayedExpansion
(for /F "skip=1 tokens=1,2" %%a in ('wmic process get name^,workingsetsize') do (
set "size= %%b"
echo !size:~-10!:%%a
)) > wmicc.txt
set i=0
for /F "skip=1 delims=" %%a in ('sort /R wmicc.txt') do (
echo %%a
set /A i+=1
if !i! equ 25 goto :end
)
:end
Can I get the output as:
96931840:iexplore.exe
82161664:explorer.exe
42319872:svchost.exe
31469568:dwm.exe
25690112:SearchIndexer.exe
17002496:taskhostex.exe
11007590:VCExpress.exe
8033894:avp.exe
7190528 :Skype.exe
7000416 :SkypeBrowserHost.exe
Instead of the output from existing code:
96931840:iexplore.exe
82161664:explorer.exe
42319872:svchost.exe
33656832:svchost.exe
31469568:dwm.exe
26943488:iexplore.exe
25690112:SearchIndexer.exe
18550784:svchost.exe
17002496:taskhostex.exe
16343040:svchost.exe
#echo off
setlocal EnableDelayedExpansion
set num=25
set /A skip=-num
for /F "skip=1 tokens=1,2" %%a in ('wmic process get name^,workingsetsize') do (
set "size= %%b"
set "size=!size:~-10!"
if not defined proc[%%a] (
set "proc[%%a]=!size!"
set "size[!size!:%%a]=1"
set /A skip+=1
) else if %%b gtr !proc[%%a]! (
set "size[!proc[%%a]!:%%a]="
set "proc[%%a]=!size!"
set "size[!size!:%%a]=1"
)
)
if %skip% lss 1 (set "skip=") else set "skip=skip=%skip%"
for /F "%skip% tokens=2 delims=[]" %%a in ('set size[') do echo %%a
Output example:
5517312:NisSrv.exe
5537792:HD-LogRotatorService.exe
5939200:spoolsv.exe
6062080:WUDFHost.exe
6168576:igfxpers.exe
6279168:conhost.exe
6369280:wmpnetwk.exe
6533120:hkcmd.exe
6692864:igfxtray.exe
8073216:notepad.exe
8077312:WMIC.exe
8105984:taskhost.exe
9306112:lsass.exe
11157504:winlogon.exe
11767808:taskhostex.exe
13402112:SkyDrive.exe
16629760:TabTip.exe
17121280:SearchIndexer.exe
26120192:HD-Agent.exe
32325632:csrss.exe
36429824:svchost.exe
43114496:dwm.exe
101998592:explorer.exe
110260224:MsMpEng.exe
114425856:chrome.exe
#echo off
setlocal EnableDelayedExpansion
for /f "delims==" %%a in ('set # 2^>nul') do set "%%a="
(for /F "skip=1 tokens=1,2" %%a in ('wmic process get name^,workingsetsize') do (
set "size= %%b"
echo !size:~-10!:%%a
)) > wmicc.txt
set i=0
for /F "skip=1 delims=" %%a in ('sort /R wmicc.txt') do (
for /f "tokens=1*" %%p in ("%%a") do (
rem the following line doesn't work
rem if not defined "#%%q"
rem the preceding line doesn't work
SET "flag="
FOR /f "tokens=1*delims==" %%v IN ('set #%%q 2^>nul') DO IF /i "%%v"=="#%%q" SET "flag=Y"
IF NOT DEFINED flag (
set "#%%q=Y"
echo %%a
set /A i+=1
if !i! equ 25 goto :end
)
)
)
:end
This tokenises the entire line as read into %%p,q so %%q contains the process-name. It then checks whether the variable #processname is defined and if it is not, generates the report-line and sets #processname so that the first mention will be the last as that variable is now defined.
The first line is designed to set any existing #* variables to empty; the 2^>nul suppresses error messages should no #* variables exist and the caret escapes the > to tell cmd that the > is part of the command to be executed, not of the for.
[later]
It appears that the if defined "varname" that I invented doesn't actually work, although it appeared to work when I tested it. I've replaced that instruction with code that does work and marked it out.

Start program and get process id

In batch file I can start a program in parallel to current session via
start "" notepad.exe
but I need to get a handle of the process I've started. How can I get it?
#echo off
:: set your own command here
set "command=notepad"
set "workdir=."
set "ReturnValue="
set "ProcessId="
for /f " skip=5 eol=} tokens=* delims=" %%a in ('wmic process call create "%command%"^,"%workdir%"') do (
for /f "tokens=1,3 delims=; " %%c in ("%%a") do (
set "%%c=%%d"
)
)
if not %ReturnValue%==0 (
echo some kind of error - error code %ReturnValue%
) else if defined ProcessId echo PID -^> %ProcessId%
delims in this line for /f "tokens=1,3 delims=; " should be for /f "tokens=1,3 delims=;<tab><space>" and I don't know if the tab will correctly copied.You also need to check if your editor replaces tab with spaces.Check also this.
Based on #npocmaka answer found the other solution:
#echo off
set pid=0
for /f "tokens=2 delims==; " %%a in ('wmic process call create "notepad.exe"^,"%~dp0." ^| find "ProcessId"') do set pid=%%a
echo %pid%
timeout 5
taskkill /pid %pid%

Resources