如何管理处理从另一个对象扩展的字符串列表?

Gre*_*fey 1 powershell

所以,我一直遇到这样的问题:

$fileNames = Get-ChildItem -Path . -Filter "*.*" `
    | Select-Object -ExpandProperty Name

$fileNames.GetType()
Run Code Online (Sandbox Code Playgroud)

我希望输出为string [],但它是object [].

更糟糕的是,如果我然后尝试操纵文件名:

$fileNames = Get-ChildItem -Path . -Filter "*.*" `
    | Select-Object -ExpandProperty Name `
    | Select-Object { "$_" -replace '^.*deploy\.log\.\d\d\d\d-\d\d-\d\d\.', '' }
Run Code Online (Sandbox Code Playgroud)

我再次期待string [].相反,我得到一些奇怪的哈希表作为正则表达式的关键.

在这两种情况下,它都按照我的预期进行,只需将其包装在对象中.

这里的规则是什么?我可以操作一个字符串列表吗?

Mat*_*sen 5

作为您的最后一个管道元素,使用ForEach-Object代替Select-Object

$fileNames = Get-ChildItem -Path . -Filter "*.*" `
    | Select-Object -ExpandProperty Name `
    | ForEach-Object { "$_" -replace '^.*deploy\.log\.\d\d\d\d-\d\d-\d\d\.', '' }
Run Code Online (Sandbox Code Playgroud)

Select-Object -Expand如果您愿意,您可以完全跳过该部分:

$fileNames = Get-ChildItem -Filter *.* | ForEach-Object {
    $_.Name -replace '^.*deploy\.log\.\d\d\d\d-\d\d-\d\d\.', ''
}
Run Code Online (Sandbox Code Playgroud)


Ans*_*ers 5

你的第一个代码片段的结果是一个通用数组(因此它的类型说Object[]),但元素实际上是字符串.如果由于某种原因你需要类型,string[]你可以简单地将变量强制转换为该类型:

[string[]]$filenames = Get-ChildItem ... | Select-Object -Expand Name
Run Code Online (Sandbox Code Playgroud)

但通常情况下,这不应该是必要的.

在你的第二个代码片段,你可能混淆Select-ObjectForEach-Object(见马蒂亚斯的回答).ForEach-Object您也可以-replace直接在扩展名称上使用运算符,而不是使用循环:

$filenames = (Get-ChildItem ... | Select-Object -Expand Name) -replace '^.*deploy\.log\.\d{4}-\d{2}-\d{2}\.', ''
Run Code Online (Sandbox Code Playgroud)