2015-07-09 25 views
5

Próbuję uzyskać prostą wartość z pętli for /f w pliku wsadowym.Dlaczego for/f nie ignoruje pustych linii?

Użycie polecenia wmic path win32_localtime get dayofweek daje mi wynik:

C:\sendemail>wmic path win32_localtime get dayofweek 
DayOfWeek 
1 


C:\sendemail> 

Tak, stosując następujący skrypt wsadowy, powinienem być w stanie powrócić wyniku „1”:

set cmd=wmic path win32_localtime get dayofweek 
for /f "tokens=1 skip=1" %%Z in ('%cmd%') do set _myday=%%Z 
echo Var is %_myday% 

Ale nie, ustawia zmienną co najmniej dwa razy, jak widać tutaj:

C:\sendemail>set cmd=wmic path win32_localtime get dayofweek 

C:\sendemail>for /F "tokens=1 skip=1" %Z in ('wmic path win32_localtime get dayofweek') do set _myday=%Z 

C:\sendemail>set _myday=1 

:\sendemail>set _myday= 

C:\sendemail>echo Var is 
Var is 

C:\sendemail> 

Na początku zastanawiałem się dlaczego, wtedy uświadomiłem sobie, że pętla przetwarza dwie puste linie ... które nie powinny. zgodnie z tym: http://ss64.com/nt/for_cmd.html

Pomiń SKIP pominie przetwarzanie liczbę linii od początku pliku. SKIP zawiera puste wiersze, ale po ukończeniu SKIP, FOR/F ignoruje (nie wykonuje iteracji) puste wiersze.

Albo, nie działa normalnie, czy te linie nie są puste i są wypełnione czymś ...

W każdym razie, w jaki sposób mogę uzyskać tylko dzień tygodnia wyniku z tego i zignorować resztę?

Odpowiedz

1

Ten niewielki midification zadziała:

@ECHO OFF 
set cmd=wmic path win32_localtime get dayofweek 
for /f "tokens=1 skip=1" %%Z in ('%cmd%') do (
    set _myday=%%Z 
    GOTO BREAK 
) 
:BREAK 
echo Var is %_myday% 
PAUSE 

Wystarczy wyskoczyć z pętli po przeczytaniu żądaną linię.

+0

tak, działa dobrze. Dziękuję. – Stese

4

Informacje o zawartości linii, tak, dane wyjściowe z wmic zawierają na końcu każdej linii dodatkowy znak powrotu karetki, który jest wykrywany przez komendę for. To jest powód, dla którego twoje nie pustych linii.

Można spróbować z

for /f "tokens=2 delims==" %%Z in (' 
    wmic path win32_localtime get dayofweek /value 
') do for /f %%Y in ("%%Z") do set "_myday=%%Y" 

Kod prosi wmic powrócić informacje w formacie key=value i za pomocą znaku równości do tokenize rekordy wejściowe. Ponieważ żądamy tylko drugiego tokena, for przetwarza tylko linie, które zwracają co najmniej dwa tokeny, linie posiadające klucz (pierwszy token), znak równości (ogranicznik) i wartość (drugi token)

Ale dodatkowe powrót karetki na końcu linii jest również uwzględniany w wartości zmiennej.

Gdy zmienna jest używana z normalną składnią (%_myday%), nie jest widoczna, ale z opóźnionym rozszerzeniem (!_myday!) zostanie powtórzony dodatkowy powrót karetki.

Aby usunąć ten dodatkowy znak ze zmiennej, w opublikowanym kodzie użyto drugiej komendy for.

+0

Działa doskonale i dobrze wyjaśnione, dziękuję. – Stese

Powiązane problemy