batch-file - 如何在管道中涉及的 FOR 循环中设置变量?

标签 batch-file for-loop pipe environment-variables

我知道这个问题已被问过很多次,但我已经阅读了几个小时的答案并尝试了所有方法,但似乎没有任何效果。基本上我无法在 for/F 循环中成功(重新)设置变量。

我想执行以下操作:检查两台计算机之间的连接,如果连接不再存在,则执行操作(基本上是启动程序)。

@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

这里我假设如果 PING 命令没有返回至少一次“Reply”这个词,那么连接就丢失了。

第一个“DO @ECHO %%a”有效,但它不会重置变量“_A”。我需要这个变量在 FOR 循环之外,因为之后“if %_A%==1”将只需要执行一次程序。

有人知道我做错了什么吗?非常感谢你的帮助。我真的尝试了所有方法,包括 setlocal enabledelayedexpansion 和在 !! 之间放置变量,但没有任何效果,它总是打印“FAIL”而不是“SUCCESS”。

最佳答案

这是一个很好的问题!问题是管道 | 因为这会为双方初始化单独的临时 cmd 实例。变量 _A 在正确的实例中设置,但之后丢失。

如果你这样做:

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

它将起作用,因为 set 命令位于运行批处理脚本的主 cmd 实例中。

注意 escaped 管道 ^|,这是将其执行转移到 for/F 创建的 cmd 实例所必需的 用于它解析的命令行。

关于batch-file - 如何在管道中涉及的 FOR 循环中设置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013512/

相关文章:

path - 如何仅为该批处理文件执行添加设置路径?

用于两个相同数据库的 Python + MySQLDB 批量插入/更新命令

linux - Linux 中的管道运算符

c++ - C++中的前后自增/自减运算符在循环中是否具有相同的性能?

c - 管道和 fork

c - SIGPIPE中一个简单的二进程程序

用于创建文件和日期的 csv 列表的 Windows 批处理文件

windows - 查找和替换 IR 代码

java - 使用基本逻辑创建 N×N 对角矩阵

r - for 循环与 cor.test 在许多类别上