为什么在传递将其传递给 for 循环显示的 exclude 参数时不显示完整的目录名称?

Why doesn't the full directory name display when passing an exclude parameter which passes it to a for loop to display?

所以,我实际上不相信我传递给参数的字符串值是问题所在,我认为它是我的 for 循环显示它的方式。

Function Get-Users{
[cmdletbinding()]
    Param(
        [Parameter(Mandatory=$false,
                   ValueFromPipeLine=$true,
                   ValueFromPipeLineByPropertyName=$true,
                   HelpMessage='Enter Computer Name')]
                   [Alias('CN','Computer','Name')]
                   [ValidateLength(1,15)]
                   [string]$ComputerName = $env:COMPUTERNAME,

        [Parameter(Mandatory=$false,
                   ValueFromPipeLine=$true,
                   ValueFromPipeLineByPropertyName=$true)]
                   [String]$Exclude

                   )

$UNC = Get-ChildItem -Path \$ComputerName\c$\Users -Exclude $Exclude -Directory | Select-Object -ExpandProperty Name | Sort-Object -Descending
    for($i=0; $i -lt $UNC.Count; $i++){
        "$($i): $($UNC[$i])" }

      ""
$SS = Read-Host -Prompt "Enter # of user(s)"
$s  = $SS -split " "
    foreach($user in $UNC[$s]){
        "$User" }

}

我觉得这应该像我在控制台中 运行 时那样工作,就像这样:Get-ChildItem -Path C:\users -Exclude "Abraham" -Directory;它只是排除了我的目录列表。

即使在参数中未指定任何内容,它仍然可以正常运行:Get-ChildItem -Path C:\users -Exclude "" -Directory 关于列出所有目录,但是当我使用自制参数传递它时,它无法正确显示。我得到的是以下内容:

PS > Get-Users -Exclude Abraham

0: P

Enter # of user(s): 

什么时候应该是:

PS > Get-Users -Exclude Abraham

0: Public

Enter # of user(s): 

有人可以告诉我为什么它不显示完整的目录名称吗?

请注意,如果未指定 -Exclude 参数,它将列出所有目录。

将此 $UNC = Get-ChildItem -Path \$C...... 更改为此 $UNC = @(Get-ChildItem -Path \$C......) 或此 [array]$UNC = Get-ChildItem -Path \$C.......

问题是你只从 gci 得到一个结果,因为变量是一个字符串而不是一个数组,因此当调用你的字符串的位置 0 时你得到字符串的第一个字母而不是数组的第一个元素:)

PS /~> $unc=(gci *.txt).Name              
PS /~> for($i=0; $i -lt $unc.count; $i++)
{
    "$($i): $($UNC[$i])" 
}
0: t
PS /~> [array]$unc=$unc
PS /~> for($i=0; $i -lt $unc.count; $i++)
{
    "$($i): $($UNC[$i])" 
}
0: test.txt