麻烦地在Powershell中使用-like匹配单词

时间:2014-12-09 18:56:18

标签: powershell if-statement string-matching

我的代码不正常,它应该采取浮动"这个"或"那"并确定它是否与上述单词之一相匹配,但它目前在第一个if语句处停止并且说所有单词都与之匹配,但他们肯定不会这样做。我已经尝试-match-eq-like ....我放了一个" x"在错误的线前面。这只是一个更大代码的短线。 (BRC - 批量重命名实用程序(命令行))

if ($this){
    #exceptions
    if ($that -like "Drücker" -or "Biegekern" -or "Führung" -or "Pressentisch"){Write-Host ("x($i/$rowMax) Replacing $that with $this")
        .\BRC32 /DIR:$directory /INCLR /RECURSIVE /quiet /IGNOREFILEX /REPLACECI:"3_$that":"3_$this ($that)" /REPLACECI:_Dr.Pos.:"_$this ($that)_Pos_" /replaceci:" ":_ /execute
    }
    elseif ($that -like "Halteplatte" -or "Oberteil" -or "Unterteil" -or "Schieber"){Write-Host ("($i/$rowMax) Replacing $that with $this")
        .\BRC32 /DIR:$directory /INCLR /RECURSIVE /quiet /IGNOREFILEX /REPLACECI:"3_$that":"3_$this ($that)" /replaceci:" ":_ /execute
        .\BRC32 /DIR:$directory /INCLR /RECURSIVE /quiet /IGNOREFILEX /REPLACECI:"2_$that":"2_$this ($that)" /replaceci:" ":_ /execute
    }
    elseif ($that -like "Schnitt"){Write-Host ("($i/$rowMax) Replacing $that with $this")
        .\BRC32 /DIR:$directory /INCLR /RECURSIVE /quiet /IGNOREFILEX /REPLACECI:"0_$that":"0_$this ($that)" /replaceci:" ":_ /execute
    }
    elseif ($that -like "Zusatzführung"){Write-Host ("($i/$rowMax) Replacing $that with $this")
        .\BRC32 /DIR:$directory /INCLR /RECURSIVE /quiet /IGNOREFILEX /REPLACECI:"2_$that":"2_$this ($that)" /replaceci:" ":_ /execute
    }

    #main renaming function
    elseif ($that){
        Write-Host ("($i/$rowMax) Replacing $that with $this")
        .\BRC32 /DIR:$directory /INCLR /RECURSIVE /quiet /IGNOREFILEX /REPLACECI:"_$that":"_$this ($that)" /replaceci:" ":_ /execute
    }
}
elseif ($that){
    Write-Host ("($i/$rowMax) Blank-Skip")
    $blanks=$blanks+1
}
else {
    $i=$rowMax
}

2 个答案:

答案 0 :(得分:2)

人们会犯错误。我做吨!最好的学习方式。因为匹配$that的多个标准可能更适合这样的事情。具有相同逻辑的简单正则表达式

if ($that -match "(Drücker|Biegekern|Führung|Pressentisch)"){
    Do-Stuff()
}

如果你对比赛的反应不同,那么开关会更合适。

switch ($that) 
    { 
        Drücker {"wo sind meine Hosen."} 
        Biegekern {"meinem Hologramm ist voller Ohren."} 
        Führung {"mein Deutsch ist nicht gut."} 
        Pressentisch {"Zwei."} 
        default {"keine Ahnung."}
    }

可以找到其他更复杂的切换示例here。使用上述两个片段的示例就是这个

$that = "Zusatzführung"

switch -Regex ($that) 
    { 
        "^(Drücker|Biegekern|Führung|Pressentisch)$" {"wo sind meine Hosen."} 
        "^(Halteplatte|Oberteil|Unterteil|Schieber)$" {"meinem Hologramm ist voller Ohren."} 
        "Schnitt" {"mein Deutsch ist nicht gut."} 
        "Zusatzführung" {"Zwei."} 
        default {"keine Ahnung."}
    }
在这种情况下,

$that将匹配第一个条目。如果您正在寻找完整的单词匹配,您可以像我一样使用^$。您还可以使用break关键字来阻止多个条目匹配。

....
"(Drücker|Biegekern|Führung|Pressentisch)" {"wo sind meine Hosen."; Break} 
"Zusatzführung" {"Zwei."}
....

使用与上述行相同的$that只会匹配第一行。然后在输出线之后我们退出开关。

答案 1 :(得分:0)

简单地说,要完成这项工作,你需要重写 - 和 - 或。我只是一个dingus

if ($that -like "Drücker" -or $that -like "Biegekern" -or $that -like "Führung" -or $that -like "Pressentisch"){Write-Host ("x($i/$rowMax) Replacing $that with $this")
                    .\BRC32 /DIR:$directory /INCLR /RECURSIVE /quiet /IGNOREFILEX /REPLACECI:"3_$that":"3_$this ($that)" /REPLACECI:_Dr.Pos.:"_$this ($that)_Pos_" /replaceci:" ":_ /execute
                }