为什么 PowerShell 在某些情况下会在点处拆分参数

Jan*_*kkö 3 powershell

我有以下程序(print-args.exe):

#include <iostream>
int main(int argc, char** argv)
{
  for( int i = 1; i < argc; ++i )
  {
    std::cout << "Arg " << i << ": " << argv[i] << std::endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,带有点 (.) 的参数被分成两个参数:

PS C:\print-args> .\print-args.exe -text.txt /text.txt -path=c:\text.txt --foo=value.txt
Arg 1: -text
Arg 2: .txt
Arg 3: /text.txt
Arg 4: -path=c:\text.txt
Arg 5: --foo=value.txt
Run Code Online (Sandbox Code Playgroud)

从 cmd.exe 运行时,参数如预期:

C:\print-args>.\print-args.exe -text.txt /text.txt -path=c:\text.txt --foo=value.txt
Arg 1: -text.txt
Arg 2: /text.txt
Arg 3: -path=c:\text.txt
Arg 4: --foo=value.txt
Run Code Online (Sandbox Code Playgroud)

参数的拆分发生在:

  • 参数刚好以一个减号 (-) 开头
  • 参数包含一个或多个点
  • 参数在第一个点之前不包含冒号 (:)

上述行为的原因是什么?

Kei*_*ill 5

在 PowerShell 中,参数解析-<alphachar>是参数的名称。 .参数名称中不允许使用,因此 PowerShell 显然认为是参数参数的开头。如果您希望 PowerShell 简化其解析使用,--%例如:

.\print-args.exe --% -text.txt /text.txt -path=c:\text.txt --foo=value.txt
Run Code Online (Sandbox Code Playgroud)

您可以--%在 man 主题中阅读有关内容about_parsing。顺便说一句,我们在PSCX 中有一个专门用于这种调试的命令,称为 echoargs.exe。:-)