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地址然后执行此操作...
答案 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
只匹配 - 或者更确切地说,不匹配 - 一个精确的字符串,而不支持通配符。相反,您应该使用-notlike
:if ($addr -notlike "./*") {...}
。请注意,如果您提供文件的完整路径(例如D:\Foo\IPs.txt
),您仍然会遇到问题,但根据您的示例输入,此处的比较是您的具体问题。