从powershell中的变量中提取数字

时间:2013-07-18 21:08:06

标签: regex powershell

我是PowerShell的新手,我正试图从变量中提取一个数字。例如,我使用此命令获取端口列表: $ ports = [system.io.ports.serialport] :: getportnames()

$ ports的内容是:COM1,COM2,COM10,COM16等。

我想从$ ports中提取数字。我看了这个question。它做我想要的,但是从文件中读取。

请告诉我如何解决此问题。

感谢。

编辑:我能够按照以下方式做我想做的事情:

 $port=COM20

 $port=$port.replace("COM","")

但如果还有其他方法可以做到这一点,我将很乐意学习它。

3 个答案:

答案 0 :(得分:4)

嗯,快速的方法是

$portlist = [System.IO.Ports.SerialPort]::GetPortNames() -replace 'COM'

如果您希望它是整数列表而不是数字字符串,那么您可以使用

[int[]] $portlist = ...

答案 1 :(得分:2)

这样的事情应该有效:

# initialize the variable that we want to use to store the port numbers.
$portList = @()

# foreach object returned by GetPortNames...
[IO.Ports.SerialPort]::GetPortNames() | %{
    # replace the pattern "COM" at the beginning of the string with an empty
    # string, just leaving the number.  Then add the number to our array.
    $portList += ($_ -ireplace "^COM", [String]::Empty)
}

请注意,我使用的是[IO.Ports.SerialPort]而不是[System.IO.Ports.SerialPort]。这些是相同的事情 - PowerShell隐含地假设您正在使用[System]命名空间,因此您不需要明确指定它,尽管这样做没有任何问题。

修改 回答你的问题:

%{...}foreach-object {...}的缩写。

$_表示当前正在管道中的对象。当我们进入foreach-object区块时,$_会解析为我们当前正在处理的整个集合中的一个对象。

如果我们编写的代码有点不同,我认为它会更容易理解。在这些示例之间,$_$port是相同的。

$portList = @()
foreach ($port in [IO.Ports.SerialPorts]::GetPortNames()) {
    $portList += ($port -ireplace "^COM", [String]::Empty)
}

希望有所帮助!

答案 2 :(得分:1)

这应该涵盖它:

$portnos = $ports | foreach {$_ -replace 'COM',''}