Cómo leer una cadena de un archivo de texto y usarla en un archivo por lotes de Windows para extraer una subcadena
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
¿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
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