gpt4 book ai didi

PowerShell 和 cmd 返回不同的结果

转载 作者:行者123 更新时间:2023-12-03 09:31:51 24 4
gpt4 key购买 nike

为什么这些返回不同的结果?我对 cmd 命令缺少什么?

PS C:\src\t\cad> Get-ChildItem -Directory -Recurse -Path $Env:ProgramFiles -ErrorAction SilentlyContinue | Measure-Object

Count : 17381

以及来自 cmd.exe:

10:28:18.87  C:\src\t\cad
C:>powershell -NoProfile -Command "Get-ChildItem -Directory -Recurse -Path '"%ProgramFiles%"' -ErrorAction SilentlyContinue ^| Measure-Object"

Count : 0

最佳答案

发生这种情况是因为插入符号^。您正在尝试转义命令解释器的管道 |,但您不需要这样做,因为它已经在带引号的字符串中,因此它不会被解释并直接发送到 PowerShell。

因此,PowerShell 会看到以下内容:

Get-ChildItem -Directory -Recurse -Path 'C:\Program Files' -ErrorAction SilentlyContinue ^| Measure-Object

那么为什么这不起作用呢?

PowerShell 命令的参数由空格分隔,当参数未明确命名时,如果可能,将按位置进行处理。

让我们看一个更简单的示例来演示:

Get-ChildItem -Path . ^

同样,您将看不到任何输出,但通过跟踪,我们可以看到原因:

Trace-Command -Name ParameterBinding -Expression { Get-ChildItem -Path . ^ } -PSHost
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Get-ChildItem]
DEBUG: ParameterBinding Information: 0 : BIND arg [.] to parameter [Path]
DEBUG: ParameterBinding Information: 0 : COERCE arg to [System.String[]]
DEBUG: ParameterBinding Information: 0 : Trying to convert argument value from System.String to
System.String[]
DEBUG: ParameterBinding Information: 0 : ENCODING arg into collection
DEBUG: ParameterBinding Information: 0 : Binding collection parameter Path: argument type [String],
parameter type [System.String[]], collection type Array, element type [System.String], coerceElementType
DEBUG: ParameterBinding Information: 0 : Creating array with element type [System.String] and 1 elements
DEBUG: ParameterBinding Information: 0 : Argument type String is not IList, treating this as scalar
DEBUG: ParameterBinding Information: 0 : COERCE arg to [System.String]
DEBUG: ParameterBinding Information: 0 : Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 : Adding scalar element of type String to array position 0
DEBUG: ParameterBinding Information: 0 : BIND arg [System.String[]] to param [Path] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Get-ChildItem]
DEBUG: ParameterBinding Information: 0 : BIND arg [^] to parameter [Filter]
DEBUG: ParameterBinding Information: 0 : BIND arg [^] to param [Filter] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND cmd line args to DYNAMIC parameters.
DEBUG: ParameterBinding Information: 0 : DYNAMIC parameter object:
[Microsoft.PowerShell.Commands.GetChildDynamicParameters]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-ChildItem]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing

该插入符号按位置绑定(bind)到 -Filter 参数。 看起来过滤相当宽松,因为它不关心该值是否是无意义的;我猜它只是将其视为不匹配并且不会抛出错误

mklement0评论:

^ is technically a valid filename, and -Filter accepts filename (patterns); thus, if you had a file literally named ^, it would be matched. Using illegal-in-a-filename characters (which vary by platform) does break, though the helpfulness of the error messages varies.

因此,使用 -Filter ^ 得到的是一个从不匹配的过滤器,因此结果为 0。

关于PowerShell 和 cmd 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50658456/

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