Soy novata con Powershell, así que pido ayuda aquí.

Necesito un script de PowerShell que leería el archivo txt e incrementaría cada variable x +1, pero el contador se restablecería después de 1 línea.

Muestra (Original):

La promoción comienza a las 12:00 a. M. ET del 8 de mayo de 2017 id = "8" /> y finaliza a las 11:59 p.m. ET del 9 de junio de 2017 (" id =" 9 " /> Período de promoción id = "10" /> ”)

Salida deseada:

La promoción comienza a las 12:00 a. M. ET del 8 de mayo de 2017 id = "8" /> y finaliza a las 11:59 p.m. ET del 9 de junio de 2017 (" id =" 9 " /> Período de promoción id = "10" /> ”)

Esta es una línea, por lo que después de que el contador se restablezca a 1 nuevamente (1..n)

Encontré un script que obtiene todo el contenido del archivo e incrementa todos los valores, que no es lo que busco.

Todavía estoy investigando, así que actualizaré esto más adelante.

Actualizar script hasta ahora:

$reader = [System.IO.File]::OpenText("testfile")
#IF ([System.IO.File]::Exists($args[0])) { $contents = [System.IO.File]::ReadAllText($args[0]) } ELSE {  
   # ECHO "File does not exist!" }
try {
    for() {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }
          
        $numbers =  
        [System.Text.RegularExpressions.Regex]::Matches($line, "<x")

        for ($i = $numbers.Count - 1; $i -ge 0; $i--)
{
    
    Write-Host ($numbers[$i].Index + $numbers[$i].Length)
    
    $line = $line.Substring(0, $numbers[$i].Index) +  
        ($i + 1).ToString() +  
        $line.Substring($numbers[$i].Index + $numbers[$i].Length)
}

        $line
    }
}
finally {
    $reader.Close()
}

Logra el incremento, pero la coincidencia real de expresiones regulares desaparece después del código:

La promoción comienza a las 12:00 a. M. ET del 8 de mayo de 2017 1 id = "8" /> y finaliza a las> 11:59 p. M. ET del 9 de junio de 2017 (“ 2 id = "" /> Período de promoción 3 id = "10" /> ”).

Debe ser:

La promoción comienza a las 12:00 a. M. ET del 8 de mayo de 2017 id = "8" /> y finaliza> a las 11:59 p. M. ET del 9 de junio de 2017 (“ id = "" /> Período de promoción> id = "10" /> ”).

Gracias de antemano.

1
Petras K 23 may. 2017 a las 14:18

2 respuestas

La mejor respuesta

El script que publicó está cambiando pero le falta el

$reader = [System.IO.File]::OpenText("testfile")
#IF ([System.IO.File]::Exists($args[0])) { $contents = [System.IO.File]::ReadAllText($args[0]) } ELSE {  
   # ECHO "File does not exist!" }
try {
    for() {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }

        $numbers =  [System.Text.RegularExpressions.Regex]::Matches($line, "\<x")

        for ($i = $numbers.Count - 1; $i -ge 0; $i--)
        {

            Write-Host ($numbers[$i].Index + $numbers[$i].Length)
            $line = $line.Substring(0, $numbers[$i].Index) +  "<x" + ($i + 1).ToString() +  $line.Substring($numbers[$i].Index + $numbers[$i].Length)
        }

        $line
    }
}
finally {
    $reader.Close()
}
1
Eric Hodges 23 may. 2017 a las 12:41

¿Tienes un guión que has probado hasta ahora o esperas que la comunidad lo escriba por ti?

De cualquier manera, aquí hay un comienzo para que los otros miembros de la comunidad depuren y perfeccionen ...

$content = 'Promotion begins at 12:00 am ET on May 8, 2017 <x3 id="8" />and ends at 11:59 pm ET on June 9, 2017 (“<x id="9" />Promotion Period <x id="10" />”)'
$test = ""

ForEach($line in $content){
$splitline = $line -match '\<x\d* id\='
switch ($Matches[0]){
     "<x id=" {$test = $line.replace($Matches[0],"<x1 id=") ; break}
     "<x1 id=" {$test = $line.replace($Matches[0],"<x2 id=") ; break}
     "<x2 id=" {$test = $line.replace($Matches[0],"<x3 id=") ; break}
     "<x3 id=" {$test = $line.replace($Matches[0],"<x4 id=") ; break}
     "<x4 id=" {$test = $line.replace($Matches[0],"<x5 id=") ; break}
     default {"Something else happened"; break}
     }
write-host $test
    }

Lo siento, no voy a seguir actualizando el fragmento anterior mientras haces cambios en la publicación original.

0
Martin Sandgaard Rasmussen 23 may. 2017 a las 12:35