Powershell 使用format运算符构造路径会引发类型错误
我正在尝试使用PowerShell的内置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
-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"
}
}