加入字符数组元素

时间:2015-03-25 01:35:15

标签: arrays powershell

输入字母数字字符串,发送到较低位置,然后进行评估。然后,每三个字母都需要大写并返回一个字符串。数字/字母位置并不总是相同。

示例输入处理:

$in = read-host "value in"
$var1 = $in.tolower()

所以我给出了两个可以用作示例的变量

$var1 = 1ab23c4def56
# $var1 = a123bcd45e6f  # alternate $var1 for example purposes

$val = ($var1).ToCharArray()

foreach ($n in $val){
    if ($n -notmatch "[0-9]"){
        $alfaNo++
        if ($alfaNo -eq 4){
            $o = $([char]::ToUpper($n))
            $alfaNo = 0
            $n = $o
        }
        echo $n
    }
    else {echo $n}
}
$val

问题是循环显示每个适当的字符都会显示在上面,但是当最后显示$val时不会进行更改。

4 个答案:

答案 0 :(得分:2)

看起来您正在处理范围问题。在ForEach循环中,变量位于不影响它们来自的数组的范围内。没有完全重写的简单修改就是简单地添加一个新变量,并将其设置为ForEach循环的输出,然后使ForEach循环输出$n而不是回应它(或除此之外)。

现在,就我可以告诉你的If声明是错误的而且正确的字母实际上并没有被大写,但除此之外至少让你的代码按照你想要的方式运行:

$var1 = "1ab23c4def56"
# $var1 = a123bcd45e6f  # alternate $var1 for example purposes

$val = ($var1).ToCharArray()
$alfaNo = 0
$NewVal = foreach ($n in $val){
    if ($n -notmatch "[0-9]"){
        $alfaNo++
        if ($alfaNo -eq 4){
            $o = $([char]::ToUpper($n))
            $alfaNo = 0
            $n = $o
        }

    }
    $n
}
$newval -join ''

我个人使用Switch命令代替ForEach所有If语句。类似的东西:

$var1 = "1ab23c4def56"
# $var1 = a123bcd45e6f  # alternate $var1 for example purposes

$inc = 0
$NewVal = Switch($var1 -Split ''){
    {$_ -match "\d"} {$_;continue}
    {$_ -match "[a-z]" -and $inc -lt 2} {$_;$inc++;continue}
    {$_ -match "[a-z]"} {$inc = 0;[char]::toupper($_)}
}
$NewVal -join ''

答案 1 :(得分:1)

您正在修改$ n的值,但不修改原始数组$ val。

试试这个......

$var1 = "1ab23c4def56"
# $var1 = a123bcd45e6f  # alternate $var1 for example purposes

$val = ($var1).ToCharArray()

$alfaNo = 0
for($i=0;$i -le $val.Length;$i++){
    if ($val[$i] -notmatch "[0-9]"){
        $alfaNo++
        if ($alfaNo -eq 3){
            $val[$i] = $([char]::ToUpper($val[$i]))
            $alfaNo = 0
        }
        echo $val[$i]
    }
    else {echo $val[$i]}
}
$val

答案 2 :(得分:1)

这是另一种方法。 如果你想在String中得到结果,你必须像这样创建一个新的String对象。

$var1 = '1ab23c4def56'
$val = ($var1).ToCharArray()

for( $n=0 ; $n -lt $val.length ; $n++)
{
   if( (($n % 3) -eq 2) -AND ($val[$n] -match "[a-z]") )
   {
      $val[$n] = [char]::ToUpper($val[$n])
   }
}

$var1 = New-Object System.String ($val,0,$val.Length)

$var1

答案 3 :(得分:1)

另一种选择:

$var1 = '1ab23c4def56'

$i=0
$var1 = 
$([string[]][char[]]$var1 |
foreach { 
 if (++$i %3) { $_ }
  else { $_.ToUpper() }
 }) -join ''

$var1