以下是两个脚本。首先是有效版本:
$input_path = 'C:\Users\Will\Code\Scripts\tmp.txt'
$regex = '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b'
ipconfig | select-string "IPv4" | select-string -notmatch "192.168.56." > tmp.txt
$ipAddress = select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }
# Pop up an alert window with the IP address
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup($ipAddress,0,"Done",0x1)
# Copy the IP address to the clipboard
$ipAddress | CLIP
现在是使用变量的几乎相同但不起作用的版本:
$regex = '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b'
$input = ipconfig | select-string "IPv4" | select-string -notmatch "192.168.56."
#$input > inputVar.txt
$ipAddress = select-string -inputObject $input -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }
# Pop up an alert window with the IP address
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup($ipAddress,0,"Done",0x1)
# Copy the IP address to the clipboard
$ipAddress | CLIP
我正在使用 select-string 查找包含“IPv4”的行,并将其输入到另一个调用 select-string 的命令中,以消除包含虚拟机 IP 地址的行。如果我在不起作用的脚本的第 6 行启用测试输出,并将其与工作脚本的“tmp.txt”文件进行比较,我可以看到截至此时,两个脚本的工作方式完全相同。
此外,两个脚本中的第 10-15 行是相同的。因此,我认为唯一需要考虑的是第 8 行。
我已经尝试了所有我能想到的方法,但始终获得相同的结果(“IPv4”而不是 IP 地址)。第一个脚本按预期工作并给出了 IP。
这两个选项似乎都应该起作用(并且可能是我尝试过的所有选项中最合逻辑的),但是没有一个给我 IP:
$ipAddress = select-string -inputObject $input -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }
并且。
$ipAddress = $input | select-string -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }
我甚至尝试了消除所有额外步骤,只制作一个长管道,就像这样:
$ipAddress = ipconfig | select-string "IPv4" | select-string -notmatch "192.168.56." | select-string -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }
并且可以像这样简单地复制到剪贴板:
ipconfig | select-string "IPv4" | select-string -notmatch "192.168.56." | select-string -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } | CLIP
但是似乎什么都不起作用。
我在哪里做错了呢?
谢谢!
更新 03/13/2015 6:30pm
我正在运行 Windows 7 64位。
这是 $PSVersionTable 的输出:
Name Value
---- -----
CLRVersion 2.0.50727.5485
BuildVersion 6.1.7601.17514
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
是的,我的最终目标只是获取 IP。实际上,我只是想找到一个快速的方法来做到这一点。我想我在使用它时技术上并不需要 IP,但是一旦我开始研究它,我就对试图弄清楚其余部分产生了浓厚的兴趣。
感谢所有的帮助!
我在 ~10 年的休息后又回到编码中,我非常生疏。
如果我的不工作版本对我而言不起作用,但对您而言却起作用,我不确定为什么。当我运行它时,我在弹出窗口和剪贴板中得到的是 "IPv4",而不是 IP(我在使用临时文件的工作版本中得到了 IP)。
我将把这些正则表达式更改集成到我的当前脚本中,并尝试使用您的 gwmi 解决方案,Matt。初始运行对我没有返回任何内容,但我会玩弄它并让您知道。
如果您对为什么变量版本在我的情况下无法正确工作有更多想法,请告诉我。这对我来说完全令人困惑。
再次感谢!
更新 03/13/2015 10:27pm
这是更新后的 $PSVersionTable 的输出:
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.18444
BuildVersion 6.3.9600.16406
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
如果我在 PowerShell 中逐个运行管道命令,会发生以下情况。正如您所看到的,它似乎在第 14 行崩溃了: $ipAddress = $ipAddress | % { $_.Matches }
无论如何,希望这有所帮助:
PS C:\Users\Will\Code> $regex = '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b'
PS C:\Users\Will\Code> $inputVar = ipconfig | select-string "IPv4" | select-string -notmatch "192\.168\.56\."
PS C:\Users\Will\Code> $inputVar
IPv4 Address. . . . . . . . . . . : 192.168.0.105
PS C:\Users\Will\Code> $ipAddress = select-string -inputObject $inputVar -Pattern $regex -AllMatches
PS C:\Users\Will\Code> $ipAddress
IPv4 Address. . . . . . . . . . . : 192.168.0.105
PS C:\Users\Will\Code> $ipAddress = $ipAddress | % { $_.Matches }
PS C:\Users\Will\Code> $ipAddress
Groups : {IPv4}
Success : True
Captures : {IPv4}
Index : 3
Length : 4
Value : IPv4
PS C:\Users\Will\Code> $ipAddress = $ipAddress | % { $_.Value }
PS C:\Users\Will\Code> $ipAddress
IPv4
PS C:\Users\Will\Code>
192.168.56.
。除了其他可能存在的问题之外,您应该使用192\.168\.56\.
,因为句点是正则表达式中的控制字符,它匹配除换行符以外的任何字符*。虽然您现在使用的仍然可以匹配句点,但重要的是要知道您在做什么。 - MattSelect-String
。我会更新我的答案。 - Matt