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

时间:2016-02-15 15:00:54

标签: powershell powershell-v5.0

我正在尝试使用PowerShell的内置-f功能,但我一直遇到错误

  

无法转换' System.Object []'到#System; System.String'参数' Filter'需要。不支持指定的方法。

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

$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
  }
}

1 个答案:

答案 0 :(得分:0)

您需要将格式表达式放在子表达式中或将其分配给变量,否则PowerShell会将-f解释为Test-Path的缩写参数-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
}

进入这两个:

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
}

或(更好)这个:

$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)内重复分配静态值是一种很好的做法,使用Join-Path也是一种很好的做法。用于构建路径的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"
  }
}