es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lote: Encuentra una subcadena entre comillas dentro de una cadena.

No puedo hacer que esto funcione. Estoy leyendo un archivo XML línea por línea y luego reviso cada línea si contiene una etiqueta específica <assemblyIdentity name=”PostDeploymentAction” version”. Cuando la encuentro, la modificaría y escribiría todo de vuelta en un archivo.
Sin embargo, no puedo encontrar la etiqueta ya que contiene comillas.

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
....algo más de código....
SET dllFile=%DestPath%\%ProjectName%.dll.manifest

IF NOT EXIST "%dllFile%" (
   ECHO El archivo %ProjectName%.dll.manifest no existe^^!
   GOTO ERROR
) ELSE (
   ECHO Modificando %ProjectName%.dll.manifest en el directorio:
   ECHO %DestPath%

   REM Crear un archivo temporal en la carpeta desde donde se ejecuta este archivo por lotes
   >"temp.xml" (
      FOR /F "usebackq delims=" %%I IN ("%dllFile%") DO (
        SET "line=%%I"

        REM Insertar línea existente antes de la modificación
        SETLOCAL DisableDelayedExpansion
        ECHO %%I
        ENDLOCAL

        REM Encontrar el número de versión correcto
        SET "myVariable=<assemblyIdentity name="PostDeploymentAction" version"
        IF not "!line!"=="!line:myVariable=!" (
          echo !line!
        )
        ....algo más de código....
       )
    )
  )

Cualquier carácter de escape que use, no encontrará esta línea en particular (o encuentra todas las líneas). Todo lo demás en el código anterior funciona bien, solo IF not “!line!”==”!line:myVariable=!” no lo hace. Cualquier ayuda será muy apreciada.

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema aquí está en el uso de comillas en la cadena de búsqueda. Cuando el archivo por lotes lee una línea que contiene comillas, las trata como parte de la cadena y no como caracteres especiales. Por lo tanto, la cadena de búsqueda <assemblyIdentity name="PostDeploymentAction" version" no puede encontrar una coincidencia.

    Una forma de resolver este problema es utilizar manipulación de subcadenas para extraer las partes necesarias de la línea sin las comillas, y luego compararla con la cadena de búsqueda. Aquí tienes un ejemplo de código que debería funcionar:

    SETLOCAL EnableDelayedExpansion
    
    SET searchStr=<assemblyIdentity name="PostDeploymentAction" version"
    SET modifiedStr=<assemblyIdentity name="ModifiedPostDeploymentAction" version="2.0.0.0"
    
    FOR /F "usebackq delims=" %%I IN ("%xmlFile%") DO (
      SET line=%%I
      SET line=!line:"=!
      SET substr=!line:~0,48!
      IF "!substr!"=="%searchStr%" (
        ECHO Encontrado: !line!
        SET line=%modifiedStr%
      )
      ECHO !line!>>temp.xml
    )
    

    En este fragmento de código, primero definimos la cadena de búsqueda (searchStr) y la cadena modificada (modifiedStr). El bucle FOR itera a través de cada línea del archivo XML, con la variable line que contiene la línea actual. Eliminamos las comillas de la variable line utilizando el comando SET line=!line:"=!. Luego, usamos manipulación de subcadenas para extraer los primeros 48 caracteres de la línea y compararlos con la variable searchStr. Si coincide, modificamos la línea utilizando SET line=%modifiedStr%. Finalmente, añadimos la línea modificada a un archivo temporal (temp.xml) utilizando ECHO !line!>>temp.xml.

    Espero que esto ayude. Avísame si tienes alguna pregunta adicional.

Comments are closed.