Forfiles / P命令问题(未记录?)

时间:2019-01-16 08:57:18

标签: batch-file

我有一个场景:

x= Symmetrie(&square_matrix[0][0]);

给我一​​个错误:

  

错误:参数/选项无效-'@fsize'。

     

输入“ FORFILES /?”使用。

但是当我删除斜杠时,它会起作用:

FORFILES /P "C:\users\DominiqueGerry\Work Files\" /S /M *.doc /C "cmd /c echo @fsize"

我不明白为什么没有反斜杠这是行不通的,但是反斜杠却没有。我找不到解释此问题的任何官方文档。并且甚至在运行帮助FORFILES /P "C:\users\DominiqueGerry\Work Files" /S /M *.doc /C "cmd /c echo @fsize" 时都看不到任何提及。对此,我将不胜感激。

最好的部分是。该错误甚至与手头的问题无关。

2 个答案:

答案 0 :(得分:3)

说实话,我认为官方帮助中没有记录(至少没有我所看到的),但是实际发生的是结尾的反斜杠实际上在转义了最后一个双引号。在我看来,这实际上是一个错误。

与错误无关的原因仅是由于缺少双引号,forfiles命令检测到格式错误,反斜杠转义了。

当您没有双引号时,您将看到不会发生这种情况,因此,假设您的路径中没有空格:

FORFILES /P C:\users\DominiqueGerry\WorkFiles\ /S /M *.doc /C "cmd /c echo @fsize"

不会给您一个错误,仅仅是因为baskslash没有任何有效的字符可以转义,问题是,您在路径中确实有一个空格,因此必须使用双引号。因此,最好保留双引号而不添加尾随反斜杠:

FORFILES /P "C:\users\DominiqueGerry\Work Files" /S /M *.doc /C "cmd /c echo @fsize"

或者,如果您坚持使用反斜杠,只需将其加倍即可将其转义。

FORFILES /P "C:\users\DominiqueGerry\Work Files\\" /S /M *.doc /C "cmd /c echo @fsize"

编辑,也如 @aschipfl 的注释中所述,您可以使用.

FORFILES /P "C:\users\DominiqueGerry\Work Files\." /S /M *.doc /C "cmd /c echo @fsize"

答案 1 :(得分:0)

编译成可执行文件的C / C ++源代码可能会遵循Parsing C++ Command-Line Arguments

  

Microsoft C / C ++启动代码在解释操作系统命令行上给定的参数时使用以下规则:

     
      
  • 参数由空格分隔,空格可以是空格或制表符。

  •   
  • 插入符号(^)无法识别为转义字符或定界符。在传递给程序中的argv数组之前,该字符已由操作系统中的命令行解析器完全处理。

  •   
  • 由双引号引起的字符串(“字符串”)被解释为单个参数,而不管其中包含的空格如何。可以将带引号的字符串嵌入参数中。

  •   
  • 将双引号加反斜杠(\“)解释为文字双引号字符(”)。

  •   
  • 反斜杠将按字面意义进行解释,除非它们紧邻双引号之前。

  •   
  • 如果偶数个反斜杠后跟一个双引号,则每对反斜杠在argv数组中都放置一个反斜杠,并且双引号将被解释为字符串定界符。

  •   
  • 如果奇数个反斜杠后跟一个双引号,则每对反斜杠在argv数组中放置一个反斜杠,并且剩余的反斜杠将“双引号”转义,从而导致文字双引号(“)放在argv中。

  •   

对于C ++程序来说很常见。命令解释器开始了它的生命 建立了提到的C ++参数处理。 reg.exe和其他程序 从C ++源代码编译的文件通常具有此参数处理。

forfiles.exe不是命令解释器的内置命令,因此 cmd.exe的内置帮助不会通知您外部可执行文件如何 可能会表现出来。

您已经发现,可以用反斜杠转义双引号,即\"。 这使您可以在双引号内将字符串中的双引号引起来,即 "\"string\"",以便程序保留引号 参数已传递给。为了逃脱,请将反斜杠加倍,即\\

您收到的错误是一对的双引号被删除了 并保留转义的双引号,因此剩余的双引号 用引号引起语法错误。