如何在管道内替换字符串?

3

我正在尝试替换所选字符串的特定部分,但只返回长度属性。这是我的代码:

Get-ChildItem "StartPath/Something/Files" -Recurse -File | Select "FullName | Foreach {$_.FullName -replace "StartPath",""} | Export-Csv "ResultPath.csv"

如果我省略foreach,这个程序会输出完整的路径。因为我需要迭代大量文件,所以我想对完整路径进行剪裁。我试图替换字符串开头的一部分路径,但是上面的代码只输出了一个包含字符串长度的CSV文件。

看起来像这样:

"123"
"12"
"52"

等等。

期望的结果将是一个 CSV 文件,其中替换为:

StartPath/Something/Files1
StartPath/Something/Files2

我将会

Something/Files1
Something/Files2

我已经尝试了很多方法,但好像无法解决。 感谢任何帮助。

1个回答

3
如果你将一个字符串传递给 select / Select-Object(它的位置隐含了 -Property 参数),它必须是一个属性名称。[1] 如果你想要对每个输入对象执行开放式操作和/或产生开放式输出,你必须使用 ForEach-Object 命令。
Get-ChildItem "StartPath/Something/Files" -Recurse -File | 
  ForEach-Object { 
    [pscustomobject] @{ FullName = $_.FullName -replace 'StartPath' } 
  } | 
    Export-Csv "ResultPath.csv"

请注意使用[pscustomobject]包装器定义了FullName属性,以使Export-Csv将其作为CSV的(唯一)列创建。
如果直接将[string]实例传输到Export-Csv,它们的属性会被序列化到输出文件中-而[string]的唯一(公共)属性是其长度(.Length),这也是你看到的。

[1] 还有一种创建属性的方法是使用所谓的计算属性,这些属性是通过哈希表定义的,可以动态地创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接