Powershell if-statement传入参数

时间:2017-04-19 17:44:51

标签: powershell

param($addr)
$file = get-content $addr

if($addr -eq $null){
        "Please use a valid parameter"
}
else{
        if ($addr -ne './*'){
                write-host $addr
        }
        else{
                write-host $file
        }

}

OUPUT:

./ipAddress.txt

内容:

8.8.8.8
127.0.0.1
208.67.222.222

如果我将$file放在if语句之外,那么它就可以了。但是,我希望能够说出用户输入文件或IP地址然后执行此操作...

2 个答案:

答案 0 :(得分:3)

停止依赖位置参数。将命名参数与参数集一起使用,并消除歧义:

[CmdletBinding(DefaultParameterSetName='ByFile')]
param(
    [Parameter(
        Mandatory=$true,
        ParameterSetName='ByFile'
    )]
    [ValidateScript( { $_ | Test-File } )]
    [String]
    $Path ,

    [Parameter(
        Mandatory=$true,
        ParameterSetName='ByIP'
    )]
    [System.Net.IPAddress[]]
    $IPAddress
)

$ipAddresses = if ($PSCmdlet.ParameterSetName -eq 'ByFile') {
    $Path | Get-Content
} else {
    $IPAddress
}

foreach ($ip in $ipAddresses) {
    # do something with the IP
}

像这样调用它:

./get-Ping.ps1 -File ./fileOfIPs.txt

./get-Ping.ps1 -IPAddress 10.1.2.3
./get-Ping.ps1 -IPAddress 10.0.0.10,10.0.0.20,8.8.8.8

它甚至支持直接提供多个IP。

替代

如果你必须支持位置参数,那么我建议先测试IP:

param($addr)

$ips = if ($addr -as [System.Net.IPAddress]) { # it can be interpreted as an IP
    $addr
} else {
    $addr | Get-Content
}

foreach ($ip in $ips) {
    #do something
}

答案 1 :(得分:2)

问题是您在else子句中的比较。 -ne只匹配 - 或者更确切地说,不匹配 - 一个精确的字符串,而不支持通配符。相反,您应该使用-notlikeif ($addr -notlike "./*") {...}。请注意,如果您提供文件的完整路径(例如D:\Foo\IPs.txt),您仍然会遇到问题,但根据您的示例输入,此处的比较是您的具体问题。

查看Get-Help about_Comparison_Operators