【问题标题】:Batch FOR loop output showing whole command instead of just output when using PIPE使用 PIPE 时,Batch FOR 循环输出显示整个命令而不是仅输出
【发布时间】:2016-08-17 17:51:12
【问题描述】:

我正在尝试使用通过 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.管道为任一侧创建cmd.exe 实例,其中for 回显其主体代码;为避免这种情况,请在每个命令前加上@,或将整个正文括在() 中,并在左括号前加上@。 2、for /l命令行中缺少in关键字。 3.for /l循环定义了一个无限循环,除非你把step值改为1,比如in (1,1,2)。 4、plink部分有不平衡的引号。 5.我猜每次迭代返回的随机数都是一样的,除非你强制delayed expansion
  • 括号前的 @ 没有帮助,但是在 ping 和 echo 前面放一个可以解决问题。谢谢!这里的缺失是一个错字,但它包含在我的实际代码中。感谢您指出了这一点。循环应该是无限的,我接下来应该说一下。我一定会编辑帖子。 Plink 引号是这里的另一个错字,但不是代码。关于延迟扩展的良好链接。我以前没见过。再次感谢。这完美地回答了我的问题。

标签: windows batch-file for-loop pipe


【解决方案1】:
  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. for /L 命令行中缺少 in 关键字,必须为:

    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%就会扩展为(替换为)一个随机数,除非你强制delayed expansion

    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"
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2015-04-13
    相关资源
    最近更新 更多