Powershell 使用format运算符构造路径会引发类型错误

Powershell 使用format运算符构造路径会引发类型错误,powershell,powershell-5.0,Powershell,Powershell 5.0,我正在尝试使用PowerShell的内置-f功能,但我不断遇到以下错误: 无法将“System.Object[]”转换为参数“Filter”所需的类型“System.String”。不支持指定的方法 这是我的代码,为了能做我想做的事情,我做错了什么 $beefcakes = @('Homeboy', 'Coldfry', 'Redpearl') foreach ($bf in $beefcakes) { $HomeDir = "C:\Testing\" $DestPath = "$Hom

我正在尝试使用PowerShell的内置
-f
功能,但我不断遇到以下错误:

无法将“System.Object[]”转换为参数“Filter”所需的类型“System.String”。不支持指定的方法

这是我的代码,为了能做我想做的事情,我做错了什么

$beefcakes = @('Homeboy', 'Coldfry', 'Redpearl')
foreach ($bf in $beefcakes) {
  $HomeDir = "C:\Testing\"
  $DestPath = "$HomeDir\$bf\"
  switch ($bf) {
    Homeboy  { $redfern = "1234" }
    Coldfry  { $redfern = "888" }
    Redpearl { $redfern = "0011" }
  }

  if (Test-Path '{0}\{1}_{2}.csv' -f $DestPath, $redfern, $bf) {
    $savefile = '{0}\{1}_{2}.csv' -f $DestPath, $redfern, $bf
  } else {
    $savefile = '{0}\{1}_{2}_Redo.csv' -f $DestPath, $redfern, $bf
  }
}

您需要将格式化表达式放入子表达式中或将其分配给变量,否则PowerShell将把
-f
解释为的缩写参数
-Filter
,它需要字符串参数,而不是对象数组

Test-Path '{0}\{1}_{2}.csv' -f $DestPath, $redfern, $bf ⇕ ⇕ ⇕ ⇕ Test-Path -Path '{0}\{1}_{2}.csv' -Filter $DestPath, $redfern, $bf 这两种情况之一是:

if (Test-Path ('{0}\{1}_{2}.csv' -f $DestPath, $redfern, $bf)) {
  $savefile = '{0}\{1}_{2}.csv' -f $DestPath, $redfern, $bf
} else {
  $savefile = '{0}\{1}_{2}_Redo.csv' -f $DestPath, $redfern, $bf
}
或者(更好)是:


更一般地说,避免在循环中重复分配静态值是一种好做法(
$HomeDir
),使用cmdlet构建路径也是一种好做法(省去了管理反斜杠的麻烦)。这里甚至不需要格式运算符。只需将变量放在双引号字符串中

$HomeDir = 'C:\Testing'
foreach ($bf in $beefcakes) {
  $DestPath = Join-Path $HomeDir $bf
  ...
  $basename = "${redfern}_${bf}"
  $savefile = Join-Path $DestPath "$basename.csv"
  if (-not (Test-Path $savefile)) {
    $savefile = Join-Path $DestPath "${basename}_Redo.csv"
  }
}
$savefile = '{0}\{1}_{2}.csv' -f $DestPath, $redfern, $bf
if (-not (Test-Path $savefile)) {
  $savefile = '{0}\{1}_{2}_Redo.csv' -f $DestPath, $redfern, $bf
}
$HomeDir = 'C:\Testing'
foreach ($bf in $beefcakes) {
  $DestPath = Join-Path $HomeDir $bf
  ...
  $basename = "${redfern}_${bf}"
  $savefile = Join-Path $DestPath "$basename.csv"
  if (-not (Test-Path $savefile)) {
    $savefile = Join-Path $DestPath "${basename}_Redo.csv"
  }
}