【问题标题】:How does PowerShell split unquoted command-line arguments?PowerShell 如何拆分不带引号的命令行参数?
【发布时间】:2021-03-25 14:27:44
【问题描述】:

PowerShell 不像 cmd.exe 或 sh 那样拆分命令参数。我遇到的问题是. 字符有时但并非总是会引发新的争论。

举例说明:

PS D:\temp> gc .\list-args.py
import sys
print(*sys.argv, sep='\n')

PS D:\temp> py .\list-args.py a.txt .\b -c=d -e=.\f -g.h -.i=j
.\list-args.py
a.txt
.\b
-c=d
-e=
.\f
-g
.h
-.i=j
PS D:\temp>

Powershell 使用什么规则将一个命令行参数与下一个命令行参数分开?

这些记录在哪里?

【问题讨论】:

  • 在使用外部命令时可以使用停止解析符号 --%
  • 您可以在这里找到更多信息:about Parsing
  • @Olaf 感谢您的提示。 --% 当然很有趣,但我能做的并不是重点。我可以简单地将我的论点用引号括起来。 about_Parsing 看起来应该回答这个问题,但我认为它实际上并没有......据我所知about_Command_Syntax 也没有
  • . 在 powershell 中最常用来表示“执行这个”。要么将数据作为字符串操作,要么按照其他人的建议调整解析器。
  • 我发现了另一个文档,感觉它应该包含答案:Appendix C: The PowerShell grammar——它提供了一个提示,. 不允许出现在 <ParameterToken> 中,但其他字符不允许出现在该模式的行为方式不同,因此也无济于事

标签: powershell


【解决方案1】:

这里是 echoargs 输出 (http://ss64.com/ps/EchoArgs.exe)。

.\echoargs .\list-args.py a.txt .\b -c=d -e=.\f -g.h -.i=j

Arg 0 is <.\list-args.py>
Arg 1 is <a.txt>
Arg 2 is <.\b>
Arg 3 is <-c=d>
Arg 4 is <-e=>
Arg 5 is <.\f>
Arg 6 is <-g>
Arg 7 is <.h>
Arg 8 is <-.i=j>

一种引用解决方法:

.\echoargs .\list-args.py a.txt .\b -c=d -e='.\f' '-g.h' -.i=j

Arg 0 is <.\list-args.py>
Arg 1 is <a.txt>
Arg 2 is <.\b>
Arg 3 is <-c=d>
Arg 4 is <-e=.\f>
Arg 5 is <-g.h>
Arg 6 is <-.i=j>

. 可能用于属性引用。

$a = [pscustomobject]@{name='joe'}
write-output $a.name

joe

命令行也解析数组。

$b = 1,2,3
write-output $b[0]

1

【讨论】:

  • 我知道 args 是什么,这就是那两行 Python 告诉我们的。我要问的是为什么。
  • 就像我说的,我的猜测是正在解析点以获取属性引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2013-06-15
  • 1970-01-01
  • 2011-10-06
  • 2012-01-21
  • 2015-11-04
相关资源
最近更新 更多