gpt4 book ai didi

cmd - 没有 cmd/c 的文件

转载 作者:行者123 更新时间:2023-12-04 02:52:17 26 4
gpt4 key购买 nike

我可以运行 forfiles 命令与cmd /c ,正如预期的那样

C:\>forfiles/c "cmd/c ping/a"
必须指定 IP 地址。

但是,如果我删除 cmd /c ,它不再识别任何参数,只
基本命令

C:\>forfiles/c "ping/a"
用法:ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
[-r 计数] [-s 计数] [[-j 主机列表] | [-k 主机列表]]
[-w 超时] [-R] [-S srcaddr] [-4] [-6] 目标名称

我必须使用 cmd /c ,即使在 PATH 上使用外部命令?

最佳答案

这是原始答案。请阅读下面的行,以获得对问题的完整分析以及解决问题的更好方法

在命令及其参数之间放置两个空格

forfiles /c "ping  /a"

已编辑 虽然发布的解决方案适用于 OP 问题,但它不是一个完整的答案,因为在某些情况下此选项不起作用。

为什么?

我开始调试 forfiles参数解析例程认为问题在于解析和转换命令字符串以生成最终运行命令的方式。

不,它可以正常工作

问题的原因在于对 CreateProcess 的调用。 API 函数和 C 参数解析器的工作方式以及程序员通常如何处理参数。
forfiles将 API 调用为
CreateProcess('c:\windows\system32\ping.exe','/a', ....)

也就是说,应用程序名称和它的参数。很好很干净,但是有问题,因为应用程序的第一个参数是 /a
哪里有问题?在第一个论点。几乎所有程序中的常用参数处理都假定程序的第一个参数是程序本身(至少是它的名称),即 argv[0]是程序名称。

但为了让它表现得如此,对 CreateProcess 的调用来自 forfiles应该是任何一个
CreateProcess('c:\windows\system32\ping.exe','ping.exe /a', ....)
CreateProcess(NULL, 'c:\windows\system32\ping.exe /a', .... )

几乎每个使用 C 语言(以及更多遵循相同约定的语言)编程的人都期望 argv[0] (参数值表第一个位置)将是程序名称和 argv[1] (参数值表,第二个位置) 将是第一个参数,因为 forfiles 中不是这种情况启动的进程,第一个参数将被忽略,因为第一个实际参数将存储在 argv[0] ,而不是 argv[1]
因此,正确的行为或失败将取决于被调用程序使用的解析器/词法分析器/标记器。
  • 他们中的一些人会将添加的空间视为将存储在 argv[0] 中的附加参数。 (mingw/gcc 和 VC 中的标准分词器就是这样做的)。
  • 其他人将删除空格并将第一个非空白数据作为argv[0] (find 的情况)
  • 分词器可以采用您认为的任何其他行为。

  • 一旦标记器结束其工作,程序将处理参数并选择其中之一
  • 忽略第一个参数,因为它假定程序名称在此位置
  • 对将在命令行中找到的内容不做任何假设并确定参数。

  • 所以,空间解决方案不是万无一失的解决方案(谢谢dbenham)

    如何解决?

    由于问题是命令行参数中缺少程序名称,并且以下参数的位置不正确,因此最好的选择似乎包括它(我们可以包括任何用作 argv[0] 的东西,但与大多数程序一样期望程序名称...)
    forfiles /c "ping ping -a"
    forfiles /c "find find /c /v 0x220x22 @path"

    关于cmd - 没有 cmd/c 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26989312/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com