所以,我一直遇到这样的问题:
$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 [].相反,我得到一些奇怪的哈希表作为正则表达式的关键.
在这两种情况下,它都按照我的预期进行,只需将其包装在对象中.
这里的规则是什么?我可以操作一个字符串列表吗?
作为您的最后一个管道元素,使用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)
你的第一个代码片段的结果是一个通用数组(因此它的类型说Object[]),但元素实际上是字符串.如果由于某种原因你需要类型,string[]你可以简单地将变量强制转换为该类型:
[string[]]$filenames = Get-ChildItem ... | Select-Object -Expand Name
Run Code Online (Sandbox Code Playgroud)
但通常情况下,这不应该是必要的.
在你的第二个代码片段,你可能混淆Select-Object与ForEach-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)
| 归档时间: |
|
| 查看次数: |
44 次 |
| 最近记录: |