我正在尝试使用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
}
}
答案 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"
}
}