代码之家  ›  专栏  ›  技术社区  ›  user310291

PowerShell:如何替换格式表中的值

  •  0
  • user310291  · 技术社区  · 6 年前

    我想用相对路径缩短目录:

    $Dir = get-childitem C:\temp -recurse
    $List = $Dir | where {$_.extension -eq ".txt"}
    $List | format-table name, Directory -replace "C:\temp", ""
    

    我得到这个错误:

    Format-Table : A parameter cannot be found that matches parameter name 'replace'.
    At line:3 char:38
    + $List | format-table name, Directory -replace "C:\temp", ""
    +                                      ~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Format-Table], ParameterBindingException
        + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.FormatTableCommand
    

    正确的语法是什么?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Bill_Stewart    6 年前

    您可以使用 calculated property . 例子:

    $List | Format-Table name,
      @{Name = "Directory"; $Expression = {$_.FullName -replace "C:\\temp", ""}}
    

    计算属性只是指示属性内容的哈希表。计算属性可用于格式化选择属性并输出新自定义对象(例如, Select-Object , Format-List 等等)。

    (作为旁白: -replace 运算符使用正则表达式,因此需要编写 C:\\temp 而不是仅仅 C:\temp )

    如果您的目标是输出文件系统项目录名: Directory 不是所有文件系统对象的属性。这就是你的意思吗?

    Get-ChildItem C:\Temp\*.txt -Recurse | Format-Table Name,
      @{Name = "Directory"; Expression = {$_.FullName -replace 'C:\\temp', ''}}
    

    注意这个命令如何利用管道(不需要中间层 $List $Dir 变量)。

        2
  •  1
  •   HAL9256    6 年前

    添加到@bill_stewart的答案中。

    $Dir = get-childitem C:\temp -recurse
    $List = $Dir | where {$_.extension -eq ".txt"}
    $List | format-table name, @{Label="Directory"; Expression={$_.Directory -replace "C:\\temp", ""}}