简体   繁体   中英

How to set a variable in a FOR loop that is involved in a pipe?

I know this question has been ask many times, but I've read the answers for hours and tried everything, nothing seems to work. Basically I can't succeed to (Re-)SET a variable in a for /F loop.

I would like to do the following : check the connection between two computers and do an action (basically start a program) if the connection doesn't exist anymore.

@ECHO OFF

SET _A=0

PING localhost | (for /F "tokens=*" %%a in ('FINDSTR Reply') DO @ECHO %%a & SET _A=1)

if %_A%==0 ECHO %_A% FAIL
if %_A%==1 ECHO %_A% SUCCESS

PAUSE

Here I assume that if the PING command doesn't return at least once the word "Reply", then the connection was lost.

The first "DO @ECHO %%a" works, but then it doesn't reset the variable "_A". And I need this variable to be external to the FOR loop because after that the "if %_A%==1" will have to execute the program only once.

Anyone knows what I'm doing wrong ? Thanks a lot for your help. I really tried everything, included setlocal enabledelayedexpansion and putting variable between !! , but nothing works, it always ends up printing "FAIL" and never "SUCCESS".

This is a great question! The problem is the pipe | as this initialises separate termporary cmd instances for both sides. The variable _A is set in the right instance but is lost afterwards.

If you do:

for /F "tokens=*" %%a in ('PING localhost ^| FINDSTR Reply') do @ECHO %%a & SET _A=1

it will work as the set command is in the main cmd instance the batch script is running in.

Note the escaped pipe ^| , which is necessary to transfer its execution to the cmd instance created by for /F for the command line it parses.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM