Powershell:如何在格式表中替换值

时间:2018-08-14 17:07:54

标签: powershell

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

$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 个答案:

答案 0 :(得分:1)

您可以使用calculated property。示例:

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

计算出的属性只是指示该属性内容的哈希表。可以使用格式化cmdlet来计算属性,该cmdlet可以选择属性并输出新的自定义对象(例如Select-ObjectFormat-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变量)。

答案 1 :(得分:1)

要添加到@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", ""}}