【问题标题】:how to go through a loop and match a number of strings如何通过循环并匹配多个字符串
【发布时间】:2015-06-18 15:14:43
【问题描述】:

我有以下将一些注册表项放入一种数组中。我试图弄清楚如何查看这些对象中的每一个,并根据“en-US”或“de-DE”、“it-IT”等的特定字符串值来决定,然后找到该字符串并执行设置文件。

服务器可能安装了多种语言,我想确保它通过每种语言并安装一个设置 - 一旦完成,然后返回并再次查看它并为尚未安装的语言运行另一个设置被剧本感动。


更新:

到目前为止,感谢您的回答,我得到了以下有效的答案。但是我需要能够编写主机说明“运行意大利语设置”之类的内容,并且还可以使用 Start-Process?我正在尝试使用 Start-process 但出现错误:

$ItalianSpellingHotfix = "C:\Temp\IE11_Spelling_Hyphenation\IE-Spelling-it.msu"
$langInstalled = Get-ChildItem -Path hklm:\System\CurrentControlSet\Control\MUI\UILanguages | Select -ExpandProperty PSChildName

switch ($langInstalled)
{
    {$_ -match "it-IT"} {start-process c:\windows\system32\wusa.exe $ItalianSpellingHotfix /quiet /norestart}
    #{$_ -match "de-DE"} {"Running German Setup"}
    #{$_ -match "en-US"} {"Running US English Setup"}
    #{$_ -match "es-ES"} {"Running Spanish Setup"}
}

错误:

Start-Process : A positional parameter cannot be found that accepts argument '/quiet'.
At line:9 char:26
+     {$_ -match "it-IT"} {start-process c:\windows\system32\wusa.exe $ItalianSpel ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand

【问题讨论】:

  • 您需要遍历$langInstalled,并且可能应该使用switch 语句来检查它是否匹配,而不是if..else

标签: powershell


【解决方案1】:

本着 Arco 所建议的精神

$langInstalled = Get-ChildItem -Path hklm:\System\CurrentControlSet\Control\MUI\UILanguages | Select -ExpandProperty PSChildName

$langInstalled | ForEach-Object{
    switch -Wildcard ($_){
        "*it-IT*"{Write-host "Language contains Italian - running that setup"}
        "*de-DE*"{Write-host "Language contains German - running that setup"}
        "*en-US*"{Write-host "Language contains German - running that setup"}
        default{Write-host "Language contains something else - running that setup"}

    }
}

您可以看到我们在循环中使用switch。您需要循环对每种语言做出反应。

仅供参考,我的代码设计旨在紧凑以提高可读性。你可以在 switch 块中添加任何你想要的代码

"*it-IT*"{
    Write-host "Language contains Italian - running that setup"
    Start-Process c:\windows\system32\wusa.exe -ArgumentList "$ItalianSpellingHotfix /quiet /norestart"
}

【讨论】:

  • 谢谢你 - 我实际上正在制作这个,因为 acro444 说也使用 switch 并且做了类似于上面的事情 - 但是,问题 - 我如何从 AND 调用进程write-host tp 说我在做什么安装?即 - 我已经这样做了: {$_ -match "it-IT"} {start-process c:\windows\system32\wusa.exe $ItalianSpellingHotfix /quiet /norestart} - 但启动过程不工作,我不能看看我怎么能说“开始意大利语设置”......我将使用新代码和我的查询更新问题,以便您更好地看到它
  • @lara400 您没有正确使用 Start-Process。您的参数需要作为数组发送到-ArgumentList。请参阅有答案的stackoverflow.com/questions/17550663/…
  • 是的,明白了马特 - 我也看到了那个帖子,你上面的回答就是我所做的。非常感谢!
  • 顺便说一句 - 你知道 powershell 是否会等待每次安装完成然后运行下一个安装 - 无论如何我都会尝试一下,但只是想知道你是否知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2012-06-22
  • 2021-09-10
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多