Why is the FOR /f loop in this batch script evaluating a blank line? Why is the FOR /f loop in this batch script evaluating a blank line? windows windows

Why is the FOR /f loop in this batch script evaluating a blank line?


I just came over this topic. I've been using findstr /v to exclude empty lines:

FOR /f "usebackq skip=1 tokens=1 delims=:" %%a in (`WMIC logicaldisk WHERE "drivetype=3" GET deviceid ^| findstr /v /r "^$"`) do (


In this case the last iteration produces not an empty item, and you get your output of C|D|E|| only with echo %DISK_DATABASES%,
but echo !DISK_DATABASES! will output ||D|E|??

That's because the last element is a single <CR> character.
And <CR> characters are directly removed after the percent expansion, but not with delayed expansion.

You could avoid this, using the percent expansion to remove them

setlocal EnableDelayedExpansionFOR /f "skip=1 tokens=1 delims=:" %%a in ('"WMIC logicaldisk WHERE drivetype=3 GET deviceid"') do (  set "item=%%a"  call :removeCR  if not "!item!"=="" (    SET "DISK_DATABASES=!DISK_DATABASES!!item!|"    SET "DRIVES_TO_MONITOR=!DRIVES_TO_MONITOR!!item!:\\|"  ))goto :eof:removeCR:removeCRset "Item=%Item%"exit /b


According to http://ss64.com/nt/for_f.html

Many of the newer commands and utilities (e.g. WMIC) output text files in unicode format, these cannot be read by the FOR command which expects ASCII. To convert the file format use the TYPE command.

So it appears that WMIC and FOR don't play nice together.