usebackq ss64 read loop for commands batch windows batch-file for-loop blank-line

windows - ss64 - Lote: busque cadena para omitir las líneas anteriores y escriba los resultados en un nuevo archivo



windows batch for loop read file line by line (1)

He escrito con éxito una secuencia de comandos que toma una cadena para buscar en un archivo específico, y luego muestra la línea donde aparece por primera vez, y luego tomo ese valor en un ciclo for y omito analizar ese número de líneas y escribir su contenido a un nuevo archivo. Sin embargo, no recibo líneas en blanco que encuentro bastante problemáticas para resolver.

La cadena que estoy buscando es "/]", almacena en caché el número de línea donde ocurre, luego lo acumula en una variable con separación de coma. Luego tomo esa variable en un for-loop de nuevo y recupero el primer valor que aparece como mi variable "omitir este número de líneas" final, que luego utilizo en la parte inferior for-loop que lee ese archivo nuevamente y escribe sus valores en un nuevo archivo y omite ese número de líneas al principio del archivo.

Así que aquí está la parte del guión que hace lo que estoy describiendo arriba:

setlocal enabledelayedexpansion setlocal enableextensions set live_svn_access_file=c:/csvn/data/conf/svn_access_file set of=c:/test.txt for /f "Tokens=1 Delims=:" %%i in (''findstr /n /c:"/]" %live_svn_access_file%'') do ( rem cache value in a variable set line=%%i rem accumulate data to one variable if defined line set skip=!skip!, !line! ) rem strip first two characters in variable ", " set skip=!skip:~2! rem strip everything except first value in array for /f "Tokens=1 Delims=," %%i in (''echo !skip!'') do ( rem store value in a variable set skip=%%i ) rem calculate lines - 1 (arithmetic) set /a skip=!skip!-1 set skip=!skip! if not defined skip set error=Could not automatically find which parts to skip from live svn_access_file && goto error-handler for /f "Tokens=* Delims= Skip=%skip%" %%i in (%live_svn_access_file%) do ( rem cache value in a variable set read-input=%%i rem write and append content of variable to output-file echo !read-input! >> %of% )

He reescrito la secuencia de comandos para que coincida con la de trabajo, este es el script modificado:

setlocal enabledelayedexpansion setlocal enableextensions set live_svn_access_file=c:/csvn/data/conf/svn_access_file set of=c:/test.txt for /f "Tokens=1 Delims=:" %%i in (''findstr /n /r /c:"/[..*/]" %live_svn_access_file%'') do ( rem cache value in a variable set line=%%i rem accumulate data to one variable if defined line set skip=!skip!, !line! ) rem take the 2nd sections linenumber into a variable, skipping the first [*foo*] for /f "Tokens=2 Delims=," %%i in (''"echo !skip!"'') do ( rem store value in a variable set skip=%%i ) rem add 1 line to skip from retrieved value set /a skip=!skip!-1 rem verify that number of lines to skip has been successfully retrieved, if not go to error-handler if not defined skip set error=Could not automatically find which parts to skip from live svn_access_file && goto error-handler if ["%skip%"] LSS ["1"] set error=Number of lines to skip was less than 1, this will most likely fail && goto error-handler rem read live svn_access_file, but skip X-lines and write to output-file setlocal DisableDelayedExpansion for /f "usebackq Delims= Skip=%skip%" %%i in (`"findstr /n ^^ %live_svn_access_file%"`) do ( rem cache value in a variable set read-input=%%i rem write and append content of variable to output-file setlocal EnableDelayedExpansion rem strip line number prefix set read-input=!read-input:*:=! rem write read lines to output-file echo(!read-input!>>%of% endlocal )


Tienes dos problemas principales, un FOR / F no puede leer las líneas vacías (como descubres) y si usas la expansión retardada obtienes problemas con los signos de admiración en la línea set read-input=%%i .

Puede resolver tanto las líneas vacías con el prefijo de cada línea con un número de línea usando findstr. El segundo con la técnica de alternar demorada.

SETLOCAL DisableDelayedExpansion FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do ( set "var=%%a" SETLOCAL EnableDelayedExpansion set "var=!var:*:=!" This removes the prefix echo(!var! ENDLOCAL )