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
)