Sé que esto es una vieja pregunta, pero aquí hay alguna información adicional para cualquier persona con un problema similar ...
Lee, su razonamiento sobre por qué "%% a" no está funcionando fuera el bucle for es correcto. Las variables% a-z y% A-Z (%% a-z dentro de un archivo por lotes) son una construcción del ciclo for, y no existen fuera de él.
Me gustaría recomendar una solución alternativa a este problema que coincida con los números de línea correctos (no se saltan líneas vacías) y no requiere expansión retrasada, contadores o una instrucción goto. Echar un vistazo al siguiente código:
@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "c:\file_list.txt"') do if "%%a"=="%1" set line=%%b
echo.%line%
Esto es lo que me llevó a los cambios anteriores. Vamos a decir que tenía los siguientes contenidos de archivo:
Some text on line 1
Blah blah blah
More text
La primera cosa que hice fue el cambio . (C: \ file_list.txt) .para('findstr/n * "c: \ file_list.txt "').
- 'findstr/n. * "Path \ filename"' lee el archivo y añade un número de línea ('/n ') para cada línea (' . *' es una expresión regular que coincida con "0 o más" de cualquier personaje). Como cada línea ahora tendrá un número de línea al principio (incluso las vacías), el bucle for no omitirá ninguna línea.
Cada línea ahora se verá así dentro del bucle:
1:Some text on line 1
2:Blah blah blah
3:More text
A continuación, utilizamos "tokens = 1 * delims =:" para romper el número de línea y el contenido.
- 'tokens = 1 *' establece el primer contador (almacenado en %% a) a todo antes de que el delimitador, y el segundo contador (almacenado en %% b) a todo después de que se .
- 'delims =:' establece ":" como el carácter delimitador utilizado para separar la cadena.
Ahora, al recorrer el archivo, %% a devolverá el número de línea actual y %% b devolverá el contenido de esa línea.
Todo lo que queda es comparar la % 1 parámetro para %% a (en lugar de una variable de contador) y utilizar %% b para almacenar el contenido línea actual: si "%% a" == "% 1" set line = %% b.
Una ventaja adicional es que 'enabledelayedexpansion' ya no es necesario, ya que el código anterior elimina la lectura de una variable de contador en el medio de un ciclo for.
Editar: cambiado 'echo% línea%' a 'echo% línea%.'. Esto mostrará correctamente las líneas en blanco ahora, en lugar de "ECHO está apagado". Se ha cambiado 'tipo c: \ file_list.txt^| findstr/n. * 'a' findstr/n. * "c: \ file_list.txt" ', ya que el comando findstr ya puede leer archivos directamente.
Jeb, creo que he resuelto todos los problemas con los personajes especiales. Dar a este un tiro:
for /f "tokens=*" %%a in ('findstr /n .* "c:\file_list.txt"') do (
set "FullLine=%%a"
for /f "tokens=1* delims=:" %%b in ("%%a") do (
setlocal enabledelayedexpansion
set "LineData=!FullLine:*:=!"
if "%%b" equ "%1" echo(!LineData!
endlocal
)
)
Tenga en cuenta que 'for/f' omitirá las líneas vacías. Esto puede y probablemente hará que tu conteo disminuya en algunos casos. – Joey