【问题标题】:how to get all the arguments in a command captured in a windows .bat file如何获取在 windows .bat 文件中捕获的命令中的所有参数
【发布时间】:2020-10-06 20:39:31
【问题描述】:
grep -P  "ERROR.+SQLTransientConnectionException" uts.log  | wc -l

我试图将上述(上一个)命令复制/捕获到剪贴板。
我的尝试是包含以下内容的批处理文件 ec.bat

echo %* | clip

但是,当我在之前运行的命令上尝试时,如下所示

ec.bat grep -P  "ERROR.+SQLTransientConnectionException" uts.log  | wc -l

它只复制了 grep 部分(如下所示)而不是整个命令行。它省略了管道(|)和“wc -l”

grep -P  "ERROR.+SQLTransientConnectionException" uts.log

如何获取/请求整个命令行?是否有包含上一个命令的环境变量?是否有类似于解释here 的bash/zsh 特殊参数的东西@

【问题讨论】:

  • @(Echo=%CmdCmdLine%)|Clip 会满意吗?
  • 管道 (|) 不是批处理文件的参数,因此 %* 没有反映它,CmdCmdLine 也没有反映。由于管道的任一部分都在新的cmd 子实例中执行,我认为管道中涉及的批处理文件不可能“看到”在父cmd 实例中执行的整个命令行......
  • 另一种方法怎么样,依赖于只有一个批处理脚本实例在运行的假设:检查正在运行的进程的命令行并在它们中搜索ec.bat|
  • @aschipfl:谢谢。这个假设现在成立。我会尝试你的替代方法,但我认为 cmd.exe 对于这个用例会有类似 bash 和其他 shell 的东西。
  • 对于寻找解决方案的其他人,我可以在 ec.bat 之后传递一个引号并在命令行末尾关闭引号。删除 ec.bat 中的这些引号,然后将完整的命令复制到剪贴板。但是圣杯是在不添加引号的情况下获得完整的命令——所以,我会尝试@aschipfl 的建议。

标签: windows batch-file command-line command-line-arguments


【解决方案1】:

我从另一个角度尝试了这个问题。我试图找到命令提示符的历史记录。

https://www.itechtics.com/view-command-prompt-history-windows/#:~:text=Open%20CMD%20from%20the%20Start,within%20the%20window%20of%20CMD.,我发现你可以输入一个命令“doskey /history”来给出历史。我可以使用 tail 获取上一个命令并根据需要处理它。

我想从不同角度解决问题会有所帮助。

【讨论】:

    【解决方案2】:

    您可以使用 doskey 宏。

    doskey ec=toclip.bat "$*"

    在批处理文件中toclip.bat

    @echo off
    set line=%*
    setlocal EnableDelayedExpansion
    REM *** Remove the surrounding quotes from line
    for /F "delims=" %%L in ("!line!") DO (
        endlocal
        (echo(%%~L) | clip
    )
    

    这是出乎意料的,但是 doskey 宏优先于普通的 cmd.exe 解析。
    这会导致您的论点周围出现引号。

    但如果你的参数本身包含引号,它就会失败,比如

    ec grep "hello|world" file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2011-06-24
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多