批量FOR循环输出显示整个命令而不是仅在使用PIPE时输出

时间:2016-08-17 17:51:12

标签: windows batch-file for-loop pipe

我正在尝试使用通过Plink建立的SSH会话将命令输出发送到远程主机。我当前的命令如下所示(无限循环是故意的:

(for /l in %n (1,0,2) do ping 1.1.1.1 -n -w 1000 >nul & echo %RANDOM%) | plink.exe sessionName -l %user "cat > outputfile.txt"

我希望outputfile.txt包含一个随机生成的数字,但它包含这个:

C:\(PATH)> ping 1.1.1.1 -n 1 -w 1000 1>nul & echo 9001

为什么要发送整个命令,而不仅仅是随机数?

另外,它还附加到远程文件而不是重写。远程主机是基于Linux的,所以我希望它能重写文件,因为我正在使用>而不是>>。

1 个答案:

答案 0 :(得分:3)

  1. 管道为任一侧创建cmd.exe实例,其中for为每次迭代回显其正文代码。为了避免这种情况,请在每个命令前加@,或将整个主体包含在()中,并在左括号前加@,如下所示......:

    for /L %n in (1,0,2) do @ping 1.1.1.1 -n -w 1000 >nul & @echo %RANDOM%
    
    分别是

    ......或者这个:

    for /L %n in (1,0,2) do @(ping 1.1.1.1 -n -w 1000 >nul & echo %RANDOM%)
    
  2. in命令行中缺少for /L关键字,必须阅读:

    for /L %n in (1,0,2) do
    
  3. for /L循环定义了一个无限循环(我不确定您是否打算这样做),除非您将步长值更改为1,如:

    for /L %n in (1,1,2) do
    
  4. 要使用中的代码(根据代码),您需要将%符号加倍,例如:

    for /L %%n in (1,1,2) do
    
  5. plink部分,有不平衡的标志和引号。对于本文的其余部分,我认为应该阅读(因为我不知道该工具):

    plink -l %user%
    
  6. 每次循环迭代返回的随机数都是相同的,因为一旦整个命令行被解析,变量%RANDOM%就会扩展为(替换为)一个随机数,除非你强制{ {3}}:

    cmd /V /C "for /l %%n in (1,1,2) do @(ping 1.1.1.1 -n -w 1000 >nul & echo !RANDOM!)" | plink -l %user% > "outputfile.txt"