0

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

无法将“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
  }
}
4

1 回答 1

0

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

测试路径 '{0}\{1}_{2}.csv' -f $DestPath, $redfern, $bf
    ⇕ ⇕ ⇕ ⇕
测试路径 -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-Pathcmdlet 构建路径也是一种很好的做法(省去了管理反斜杠的麻烦)。您甚至不需要这里的格式运算符。只需将变量放在双引号字符串中。

$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"
  }
}
于 2016-02-15T15:13:17.160 回答