Cómo leer una cadena de un archivo de texto y usarla en un archivo por lotes de Windows para extraer una subcadena

Aug 20 2020

Tenemos un archivo de texto que necesitamos que contiene la siguiente muestra. Una cadena constante "D80" seguida de otra cadena:

D80KAAAAAA
D80KBBBBBB
D80KCCCCCC

Queremos extraerlo usando un archivo de script por lotes de Windows (no PowerShell) y el bucle FOR para obtener este resultado:

AAAAAA
BBBBBB
CCCCCC

Hasta ahora hemos llegado a este punto. A modo de ilustración, he mostrado los diferentes intentos de extraer la subcadena:

setlocal EnableDelayedExpansion

for /F "tokens=1 delims="    %%a   in (TPLIST.txt) do (
    echo %%a
    echo %%(a:~4,6)
    set substr1=%%(a:~4,6)%
    set substr2=%(a:~4,6)%
    set substr3=!(a:~4,6)!
    set substr4=%!(a:~4,6)!%
    echo %substr1%
    echo %substr2%
    echo %substr3%
    echo %substr4%
)

Sin embargo, el extracto de la subcadena falla:

C:\User>setlocal EnableDelayedExpansion
C:\User>for /F "tokens=1 delims=" %a in (TPLIST.txt) do (
echo %a
 echo %(a:~4,6
)
C:\User>(
echo D80KAAAAAA
 echo %(a:~4,6
)
D80KAAAAAA
%(a:~4,6
C:\User>(
echo D80KBBBBBB
 echo %(a:~4,6
)
D80KBBBBBB
%(a:~4,6
C:\User>(
echo D80KCCCCCC
 echo %(a:~4,6
)
D80KCCCCCC
%(a:~4,6
C:\User>set substr1=%(a:~4,6)
C:\User>set substr2=~4,6)
C:\User>set substr3=!(a:~4,6)!
C:\User>set substr4=~4,6)!
C:\User>echo %(a:~4,6)
%(a:~4,6)
C:\User>echo ~4,6)
~4,6)
C:\User>echo ~4,6)
~4,6)
C:\User>echo ~4,6)
~4,6)

Cualquier ayuda será muy apreciada.

Respuestas

1 DavidPostill Aug 20 2020 at 04:36

¿Cómo extraigo una subcadena?

Tu guión está horriblemente roto, así que lo reescribí:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3" %%a in (test.txt) do (
  set _s1=%%a
  set _s2=%%b
  set _s3=%%c
  echo !_s1:~4!
  echo !_s2:~4!
  echo !_s3:~4!
  )
endlocal

Uso de ejemplo:

F:\test>type test.txt
D80KAAAAAA D80KBBBBBB D80KCCCCCC

F:\test>test
AAAAAA
BBBBBB
CCCCCC
F:\test>

Otras lecturas

  • Un índice AZ de la línea de comandos de Windows CMD | SS64.com
  • Comandos CMD de Windows (categorizados) - CMD de Windows - SS64.com
  • For / f - Texto en bucle - CMD de Windows - SS64.com
  • subcadena variable - CMD de Windows - SS64.com
1 Hackoo Aug 26 2020 at 05:44

En el archivo por lotes puro, puede hacer algo como eso:

@echo off
Set "InputFile=TPLIST.txt"
Set "OutPutFile=%~dp0Out-Extract.txt"

setlocal enabledelayedexpansion
> "%OutPutFile%" (
    @for /f "delims=" %%a in ('Type "%InputFile%"') do (
    set "_MyString=%%a"
    echo !_MyString:~4!
    )
)
endlocal
If Exist "%OutPutFile%" Start "" "%OutPutFile%"

En Powershell, si otro miembro quiere probar usando RegEx:

cls
$MyString = @' D80KAAAAAA D80KBBBBBB D80KCCCCCC D80KDDDDDD D80KEEEEEE D80KFFFFFF D80KXXXXXX D80KYYYYYY D80KZZZZZZ '@ -split [System.Environment]::NewLine $pattern = '(?![D80K]).+'
$MyString | %{ [regex]::matches($_,$pattern) } | %{ $_.Groups[0].Value }

Obtendrá como salida para ambas soluciones por lotes o powershell así:

AAAAAA
BBBBBB
CCCCCC
DDDDDD
EEEEEE
FFFFFF
XXXXXX
YYYYYY
ZZZZZZ