获取数组范围的用户输入的最简单方法是什么。
例如:
function MyArrayOfMachines {
[CmdletBinding()]
param(
[parameter(Mandatory=$true)][string]$Machine
# What should I assign the $Range variable as?
)
# Hardcoded range. User should be able to enter the range
$Range = 2..5
for ($i=0; $i -lt $array.length; $i +=1)
{
$result = $array[$i]
$output = $machine+$result
$output
}
}
上述函数应将输入作为机器名称和数组范围。现在我的数组范围是硬编码的。当我在用户提示中将$ Range分配为[Array] $ Range时,会出现$ Range [0]等提示。但我希望用户输入范围。
答案 0 :(得分:4)
这不行吗?除非我误解了你的问题......
function test($range){
$range
}
test -range (1..5)
答案 1 :(得分:2)
您也可以将范围作为字符串接受并自行解析:
function Test
{
param($range)
if($range -is [String])
{
[int]$start, [int]$end = $range.split('.', [StringSplitOptions]::RemoveEmptyEntries)
$start..$end
}
else
{
$range
}
}
if / else的原因是用户传递实际范围的情况,如manojlds回答,而不是要解析的字符串(如1..5)。这意味着你不能强烈地输入参数。
答案 2 :(得分:1)
将它设为两个参数:
function test{
param ( [int]$st,
[int]$end)
$Range = $st..$end
$Range
}
test 1 5
如果他们输入范围的开头和结尾,您可以使用它在函数中动态创建它。
修改强>:
要从字符串中获取范围,请尝试:
function test{
param ($Range)
$NewRange = $Range.substring(0,($Range.indexof('.')))..$Range.substring(($Range.lastindexof('.') + 1))
$NewRange
}
test 1..5
答案 3 :(得分:0)
我同意@manojlds,范围应该作为数组传入。解析字符串会限制用户可以输入的内容。通过使用[int[]]
,您可以强制用户指定整数数组。这也允许用户指定一个破碎的范围,例如((2..4)+(6..12))
,在解析字符串时更难以允许。
在您的示例中,我不确定$array
的来源,您只需要一行来返回计算机器名称。
function MyArrayOfMachines {
param(
[parameter(mandatory=$true)]
[string] $machine,
[parameter(mandatory=$true)]
[int[]] $range
)
foreach($n in $range) {
$machine+$n
}
}
您可以创建一个机器名称
MyArrayOfMachines Laptop 1
一系列机器,
MyArrayOfMachines Workstation (2..10)
或非连续的机器阵列
MyArrayOfMachines Server ((2..3)+(5..9))
答案 4 :(得分:0)
你可以传递一个字符串并对其进行评估:
function Test([string]$range) {
if ($Range -match '^\d+\.\.\d+$') {
$RangeArray = Invoke-Expression $Range
} else {
$RangeArray = 1..5
}
}
进行了一些最小化验证,以确保用户无法传递任意代码。