我有一个场景:
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"
时都看不到任何提及。对此,我将不胜感激。
最好的部分是。该错误甚至与手头的问题无关。
答案 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\""
,以便程序保留引号
参数已传递给。为了逃脱,请将反斜杠加倍,即\\
。
您收到的错误是一对的双引号被删除了 并保留转义的双引号,因此剩余的双引号 用引号引起语法错误。