PowerShell:将逗号分隔的IPstring转换为IPAddress对象

我正在使用Get-DhcpServerv4Scope cmdlet,并且正在寻找使用-scopeid开关将多个作用域拉入variables。

 Get-DhcpServerv4Scope -scopeid 10.1.0.0,10.1.1.0 

但是,如果我这样做:

 $IP = "10.2.0.0,10.1.0.0" Get-DhcpServerv4Scope -scopeid $IP 

我得到的错误:

Get-DhcpServerv4Scope:无法处理参数'ScopeId'的参数转换。 无法将值“10.2.0.0,10.1.0.0”转换为键入“System.Net.IPAddress []”。 错误:“无法转换值”10.2.0.0,10.1.0.0“键入”System.Net.IPAddress“错误:”指定了无效的IP地址“

任何人有一个想法如何得到这个转换?

编辑:这是我试图适应这个脚本的脚本。 我想有一个方法将这个脚本指向一个服务器,它重build所有范围。 现在我在一个制表符分隔的文件中输出范围,然后将它们复制并粘贴到Get-dhcpv4scope以将所有范围存储在一个variables中。 我打开任何build议:

 #GetScopes $ScopeExclusions = Get-DhcpServerv4ExclusionRange [string]$ScopesCSV=Get-DhcpServerv4Scope | Select ScopeID | convertto- csv -notypeinformation $ScopesCSV.replace('" ', ',').replace('"', '').replace('ScopeId,', '') | out-file c:\users\aturner\desktop\csv.txt **Copy contents from file to clipboard** $Scopes=Get-DhcpServerv4Scope -scopeid *PasteScopeCSVListHere* | select ScopeId,Name,Description,SubnetMask,StartRange,EndRange,LeaseDuration #Delete Scopes $Scopes | % { Remove-DhcpServerv4Scope -ScopeId $_.scopeid -force} #Rebuild Scopes $Scopes | % {Add-DhcpServerv4Scope -Name $_.name -Description $_.description -SubnetMask $_.SubnetMask -StartRange $_.StartRange - EndRange $_.EndRange -LeaseDuration 8.00:00:00 } $ScopeExclusions | % {Add-DHCPServerv4ExclusionRange -ScopeID $_.ScopeID - StartRange $_.StartRange -EndRange $_.EndRange} 

新代码:

 #GetScopes $ScopeExclusions = Get-DhcpServerv4ExclusionRange [string]$ScopesArray=Get-DhcpServerv4Scope | Select ScopeID | convertto-csv -notypeinformation $ScopesCSV=$ScopesArray.replace('" ', ',').replace('"', '').replace('ScopeId,', '') $ScopeReservations = Get-DhcpServerv4Scope | Get-DhcpServerv4Reservation | select * $Scopes=Get-DhcpServerv4Scope -scopeid $ScopesCSV.Split(',') | select ScopeId,Name,Description,SubnetMask,StartRange,EndRange,LeaseDuration #Delete Scopes $Scopes | % { Remove-DhcpServerv4Scope -ScopeId $_.scopeid -force} #Rebuild Scopes $Scopes | % {Add-DhcpServerv4Scope -Name $_.name -Description $_.description -SubnetMask $_.SubnetMask -StartRange $_.StartRange -EndRange $_.EndRange -LeaseDuration 8.00:00:00 } $ScopeReservations | % {Add-DhcpServerv4Reservation -ScopeID $_.ScopeID -IPAddress $_.IPAddress -ClientId $_.ClientID -Description $_.Description -Name $_.Name -Type $_.Type} New 

 $IPobj = $IP | ConvertFrom-Csv -Delimiter "," -Header "ip1", "ip2" Get-DhcpServerv4Scope -scopeid $IPobj.ip1, $IPobj.ip2 

然而,你的主要问题是, $IP是一个string,而当你手动传递10.1.0.0.10.1.1.0作为参数,你实际上是传递2个string。

作为一个数组创build$IP会更好:

 $IP = @("10.2.0.0", "10.1.0.0") Get-DhcpServerv4Scope -scopeid $IP[0],$IP[1] 

如果你有多个作用域,你可以通过这种方式脚本/循环访问数组。

亚当问如何dynamic地做这件事,虽然我不知道我们在哪里得到“10.2.0.0”和“10.1.0.0”,你只需要保持填充$IP数组与你需要的所有范围ID检查,然后循环如下:

 foreach ($scopeid in $IP) { Get-DhcpServerv4Scope -scopeid $scopeid } 

上面的代码遍历$IP每个条目,将其临时存储在$scopeid ,并将其作为参数调用Get-DhcpServerv4Scope cmdlet。

有一个本地[ipaddress]演员,应该使这很容易。

 $csvIPs = "10.2.0.0,10.1.0.0" $IP = $csvIPs.Split(',') | %{ [ipaddress]$_ } Get-DhcpServerv4Scope -scopeid $IP 

我目前还没有一个运行DHCP的testing系统,但是我想你甚至可能不需要[ipaddress] cast,只需要使用.Split(',')因为Powershell应该足够聪明采取单独的IPstring,并转换为你就像它在你的第一个代码段。

 $IP = "10.2.0.0,10.1.0.0" Get-DhcpServerv4Scope -scopeid $IP.Split(',') 

我们来回答一下眼前的问题:为什么你的第一个例子工作,但你的第二个例子没有。 让我们从第一个为什么起作用开始。 它涉及到PowerShell的不同parsing模式 。

你的第一个例子(作品):

 Get-DhcpServerv4Scope -scopeid 10.1.0.0,10.1.1.0 

在第一个示例中,PowerShell处于命令parsing模式,因为您的行以命令开头。 在命令模式下,PowerShell会自动引用参数给你一个命令,因为在shell中工作的时候所有的引用都会很烦人! 这意味着它为你引用了不加引号的IP地址值,把它们变成string,','(逗号运算符)将两个string组合成一个数组。 由于参数是IPAddress [](IPAddress对象数组),因此它会尝试将您的string强制转换为IPAddress并成功,因为它们是数组中的单个条目,并且IPAddress知道如何以该格式分析1个string,并创build一个IPAddress与它的对象。 至less,我90%肯定这3件事情(逗号/数组运算符,命令parsing模式,和铸造)的组合是为什么这是可行的。

注意:更具体的命令模式可以被称为参数模式(如在命令的参数中),另一种模式被称为expression模式。 在我之前的PowerShell书中,我刚刚看到它叫做命令模式,但是当前的doc讨论了参数模式。

从文档:

在参数模式下,每个值被视为可扩展的string,除非它以下列特殊字符之一开始:美元符号($),符号(@),单引号('),双引号(“)或(())。

你的第二个例子:

 $IP = "10.2.0.0,10.1.0.0" Get-DhcpServerv4Scope -scopeid $IP 

在第一行中,您只是创build一个string"10.2.0.0,10.1.0.0" 。 PowerShell将让你做出这个string,但是你想,并保持独立。 即使你省略了双引号,你也会注意到PowerShell不会和Example 1做同样的事情…这是因为它是在Expression模式下,并且在这个模式下不会自动引用你的string。 当我尝试我没有得到任何分配。 你可能也看到了。

在你的例子的第二行中,没有什么特别的PowerShell将要做的 – 它只是一个恰好有一个逗号的string – 它不会检查和修改你的string,它只是传递它,将无法parsing到一个IP地址,因为它不是有效的forms,无论IP地址parsing方法只能处理一个IP地址,而不是一个逗号分隔的string。

这部分可以通过调整Pedrobuild议的arrays中的行来纠正。 例如:

 $IP = @("10.2.0.0","10.1.0.0") 

然后可以直接传递它:

 Get-DhcpServerv4Scope -ScopeId $IP 

但是,您没有指定是否打算仅处理某些范围。 我没有看到有关您编辑CSV以排除某些范围(或在您的代码中)的评论,所以您可以跳过所有这种情况,只需调用Get-DhcpServerv4Scope而不带-ScopeId参数,它将返回所有范围 。 然后,您可以跳过所有这到CSV和回去的工作。

我不清楚范围重build的原因,因为你似乎有可能放弃现有的8天租约(如果它们和以前一样,也许它们先设定得很短),并且可以得到地址如果服务器在这些租约的客户端到期之前重新分配服务器,则会发生冲突。 也许我错过了一些东西。 只要注意你的最终目标是什么,祝你好运!