sacar - Cambiar barra diagonal inversa para barra diagonal hacia delante en el archivo por lotes de Windows
cómo se escribe en el teclado la diagonal invertida (3)
Estoy intentando convertir todas las barras invertidas () en barras diagonales (/) en una variable que contiene un nombre de archivo y una ubicación. He leído sobre esto y lo he visto:
%variable:str1=str2%
y
set "var=%var:/=/%"
Lo he intentado, pero obviamente no lo estoy haciendo bien.
Aquí está la sección relevante de mi script .bat:
FOR %%f IN ("E:/myfiles/app1/data/*.csv") DO (
echo %%f
set "f=%%f:/=/%"
echo %%f
echo.
)
La salida muestra cada nombre de archivo listado dos veces.
es decir, esta línea:
set "f=f:/=/%"
No está haciendo lo que yo quiero. ¿Alguien puede ver lo que estoy haciendo mal?
Dentro de una instrucción de bloque (a parenthesised series of statements)
, se analiza todo el bloque y luego se ejecuta. Cualquier %var%
dentro del bloque será reemplazado por el valor de esa variable en el momento en que se analiza el bloque, antes de que se ejecute el bloque, lo mismo se aplica a un FOR ... DO (block)
.
Por lo tanto, IF (something) else (somethingelse)
se ejecutará utilizando los valores de %variables%
en el momento en que se encuentre el IF
.
Dos formas comunes de superar esto son 1) usar setlocal enabledelayedexpansion
y usar !var!
en lugar de %var%
para acceder al valor modificado de var
o 2) para llamar a una subrutina para realizar un procesamiento adicional utilizando los valores modificados.
Tenga en cuenta, por lo tanto, el uso de CALL ECHO %%var%%
que muestra el valor modificado de var
.
Su código contiene dos variables separadas llamadas f
.
El primero es el ''metavariable'' de control de bucle llamado f
y referenciado por %%f
.
La segunda es la variable de entorno común f
que se establece mediante la declaración del set "f=..."
. Se puede acceder a esta variable usando %f%
pero dentro de un block
, parecerá que retiene el valor que tenía cuando se analizó el control (de hecho, cualquier %var%
se reemplaza en el tiempo de análisis por el valor de var
en ese tiempo )
metavariables
no se pueden usar en sentencias de manipulación de cadenas como subcadenas o sustitutos, solo se pueden usar variables de entorno comunes para estas operaciones, por lo tanto, debe asignar el valor de la metavariable f
a la variable de entorno f
y luego realizar la tarea de sustitución de cadenas de la variable de entorno f
.
El giro, por supuesto, es que debe usar la delayedexpansion
y la !var!
sintaxis para acceder al valor modificado de una variable de entorno dentro de un bloque.
Asi que,
setlocal enabledelayedexpansion
for...%%f...do (
echo %%f
set "f=%%f"
set "f=!f:/=/!"
echo !f!
)
echo just for demonstration %f% !f! %%f
Esto establece el valor de f
de la manera requerida (por supuesto, siempre puede cambiar el nombre para evitar confusiones ...)
La última línea es simplemente para mostrar que se puede acceder al valor final adquirido por f
fuera del bucle como %f%
o !f!
, y que %%f
está fuera de contexto y se muestra como %f
.
Otra forma de hacerlo sin delayedexpansion
es la delayedexpansion
for...%%f...do (
echo %%f
set "f=%%f"
call set "f=%%f:/=/%%"
call echo %%f%%
)
echo just for demonstration %f% !f! %%f
la diferencia es el uso de la call
y la duplicación de %
s, ¡y la línea final se mostrará !f!
tan solo eso, un literal, ya que fuera del modo de delayedexpansion
Es solo otro personaje sin significado especial para cmd
.
Esto cambiará las barras invertidas a barras diagonales en una variable:
set "variable=E:/myfiles/app1/data/*.csv"
set "variable=%variable:/=/%"
echo "%variable%"
Esto parece funcionar para mí:
echo off
setlocal enabledelayedexpansion
FOR %%f IN ("C:/tools/workspace/*") DO (
set old=%%f
echo !old!
set new=!old:/=/!
echo !new!
echo.
)
El uso de una variable separada en lugar de la variable de bucle hace la diferencia, además de habilitar la expansión retardada como el síntex de sustitución de variables que utiliza la variable de bucle %% f no parece funcionar.