2016-12-09 34 views
2

当检索一台计算机的操作系统,我得到了不同的结果,这取决于我是否如果使用的语句或开关:powerwshell IF VS交换机

if (((Get-WmiObject -ComputerName DT-04 Win32_OperatingSystem).Caption.ToString()) -match "Microsoft Windows 7 Professional") { "Found" } Else { "Not found" } 

结果=找到

switch ((Get-WmiObject -ComputerName DT-04 Win32_OperatingSystem).Caption.ToString()) { "Microsoft Windows 7 Professional" { "Found" } Default { "Not Found" } } 

结果=未找到

这是为什么?

回答

7

这不是ifswitch这是不同的;这是运营商正在使用。在您的if中,您使用的是-match,但switch默认使用的是-eq

通过使用-match您正在执行正则表达式匹配,它将在源字符串中的任意位置找到该字符串。 -eq不会。它们都应该不区分大小写。

可以修改switch使用正则表达式或通配符匹配:

switch -regex ((Get-WmiObject -ComputerName DT-04 Win32_OperatingSystem).Caption.ToString()) 
{ 
    "Microsoft Windows 7 Professional" { "Found" } 
    Default { "Not Found" } 
} 

或:

switch -wildcard ((Get-WmiObject -ComputerName DT-04 Win32_OperatingSystem).Caption.ToString()) 
{ 
    "*Microsoft Windows 7 Professional*" { "Found" } 
    Default { "Not Found" } 
} 

另外,找出为什么你的字符串是不完全匹配,改变你的文字。你走哪条路取决于你的情况。

如果你不打算使用正则表达式,我会小心的正则表达式匹配,因为它可能很容易无意中使用特殊字符或无效的正则表达式。

+0

谢谢。它确实看起来好像在返回的字符串后面有一个空格,我发现它是: '“'+(Get-WmiObject -ComputerName DT-04 Win32_OperatingSystem).Caption.trim()+'''' 感谢您的帮助! – cswalker

+2

正确和非常好的解释答案应该通过检查它而得到尊重。 – LotPings