对象属性字符串元素,传递给Get-ChildItem的错误

时间:2016-12-09 19:00:07

标签: string powershell

我有一个问题是将一个字符串元素从一个对象传递到Get-ChildItem。我的代码如下:

$RegEx = 'Auto Apply Quota Path:\s+(.*)[\s\S]*?' +
         'Source Template:\s+(.*)\s+' +
         'Limit:\s+(.*)'
[int]$i = 0
[array]$objArr = @()

(dirquota au l | Out-String) -split '\r\n\r\n' | Where-Object {
    $_ -match $RegEx
} | ForEach-Object {
    $objArr += New-Object -Type PSObject -Property ([ordered]@{
        QuotaPath  = $matches[1]
        Template   = $matches[2]
        QuotaLimit = $matches[3]
    })
}

$objArr | % {
    gci $objArr[$i].QuotaPath
    $i++
} | Export-Csv -Path 'E:\outfile.csv'

现在我非常确定问题是因为点引用对象中的字符串元素会返回字符串的属性Length,并且我已使用outfile验证了这一点.csv格式。我需要字符串本身,并没有任何运气找到如何得到它。

下面是错误消息,奇怪地包含我需要的字符串,即UNC路径,并且它存在:

gci : Illegal characters in path.
At line:20 char:5
+     gci $objArr[$i].QuotaPath
+     ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (E:\Dir\Subdir:String) [Get-ChildItem], ArgumentException
    + FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand

gci : Cannot find path 'E:\Dir\Subdir' because it does not exist.
At line:20 char:5
+     gci $objArr[$i].QuotaPath
+     ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (E:\Dir\Subdir:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

我在网上看到的解决方案是将字符串放入自定义对象中,但它们已经存在于对象中,因此无法提供帮助。我确定我错过了一些明显的东西。

1 个答案:

答案 0 :(得分:0)

错误消息会抱怨非法字符和不存在的路径。由于您的输入字符串具有编码为CR-LF的换行符,并且正则表达式中的.元字符与除换行符(LF)之外的所有字符匹配,因此问题的最可能原因是您的QuotaPath值具有尾随值CR,不是valid character in a path

您可以通过从字符串中删除CR来避免此问题:

(dirquota au l | Out-String) -replace '\r\n', "`n" -split '\n\n'

此外,您可能希望避免在循环中附加到数组,因为它往往表现不佳。只需在变量中收集循环输出:

$objArr = (dirquota au l | Out-String) -replace '\r\n', "`n" -split '\n\n' |
          Where-Object { $_ -match $RegEx } |
          ForEach-Object { New-Object -Type PSObject -Property ... }

然后像这样处理对象:

$objArr | ForEach-Object {
    Get-ChildItem $_.QuotaPath
} | Export-Csv 'E:\outfile.csv'