¿Cómo extraer parte de una cadena en el archivo por lotes de Windows?

29

Supongamos que tengo un valor como "Abc_123" que se almacena en una variable en un archivo por lotes (cmd). Quiero terminar con una variable que contiene solo "123". ¿Hay alguna forma integrada de hacer esto?

No soy muy exigente con el método o el rendimiento, siempre que esté integrado en un sistema típico de Windows (Vista / 2008).

Conocer
fuente

Respuestas:

40

Use la sintaxis de subcadena:

C:\Users\John>set string=Abc_123

C:\Users\John>echo %string%
Abc_123

C:\Users\John>echo %string:~4,3%
123
John T
fuente
44
Puede ver la sintaxis completa help setcomo se menciona en ¿Cuál es la mejor manera de hacer una subcadena en un archivo por lotes? en StackOverflow.
Usuario5910
1
Si necesito que 4 y 3 sean entradas variables, ¿cómo lo haría? %string:~%start%,%len%%
MakPo
no importa. Encontré la respuesta. ss64.com/nt/syntax-substring.html
MakPo
3
Para resumir el enlace de @MakPo: use CALL, likeCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny
8

Si solo quiere todo después del guión bajo (y no necesariamente conoce la longitud de la cadena o dónde está el guión bajo, pero puede confiar en que solo haya un guión bajo), intente:

for /f "tokens=2 delims=_" %%a in ("%STRING%") do (
  set AFTER_UNDERSCORE=%%a
)

Básicamente, su cadena se dividirá en tokens utilizando el guión bajo como delimitador (delims = _). Solo el segundo (tokens = 2) se pasará (como variable %% a) al ciclo for. El bucle solo se ejecutará una vez, ya que se trata de una sola cadena en este caso.

Si desea guardar las cosas antes y después del guión bajo, intente:

for /f "tokens=1,2 delims=_" %%a in ("%STRING%") do (
  set BEFORE_UNDERSCORE=%%a
  set AFTER_UNDERSCORE=%%b
)

Tenga en cuenta que %% a es la variable para el primer token de la división; %% b es la variable para el segundo token de la división.

DocOc
fuente
3

Si encuentra que el lenguaje por lotes no es lo suficientemente potente como para hacer lo que desea, y probablemente no le llevará demasiado tiempo llegar a ese punto, puede usar Windows PowerShell . Esto no está instalado de forma predeterminada en todas las versiones de Windows, pero puede descargarlo de forma gratuita.

Si no te gusta el lenguaje PowerShell, está Perl. Sin embargo, tendrá que instalar eso en todos los sistemas. También hay otros.

Wayne Johnston
fuente
La pregunta no es sobre Powershell o Perl
Zimba
2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%
Zimba
fuente
3
¿Qué hace esto específicamente?
Pimp Juice IT
Ah, si estuviera preguntando cómo funciona este código: elimina todo antes del número, precedido por un guión bajo.
Zimba
@Zimba ¿hay alguna manera de simplemente extender esto a "last _"? Además, ¿dónde puedo encontrar esto en cualquier documentación?
TWiStErRob
Ok, encontré un documento, agregado para responder. Las preguntas siguen en pie: ¿cómo hago *codicioso? Solía ​​un buen ol ' IF NOT ... GOTO :replace, pero sería bueno si hubiera una mejor manera.
TWiStErRob
1
@TWiStErRob: Ya veo. Si no sabe cuántos _hay, pase al último, luegoset var
Zimba