2012-08-09 37 views
17

Quiero correr lo siguiente en secuencia de comandos por lotes donde se toma un argumento (una ruta)escape "comillas dobles" en el interior de la entrada del lote de parámetros

runas /user:abc "icacls %1 /grant Everyone:(F) /T" 

pero el argumento %1 ya contiene un " (porque es un camino , transmitido por el menú contextual Enviar a - No tengo mucho control sobre esto). Así que cuando el comando se ejecuta en el archivo por lotes se ejecuta la siguiente manera:

runas /user:abc "icacls "c:\folder" /grant Everyone:(F) /T" 

Así que, obviamente, tengo que escapar de las " s creados por %1. ¿Cómo realizo la manipulación de cadenas sobre %1 de modo que escapó de las comillas?

Respuesta

20

Usted debe ser capaz de utilizar \"Here es un sitio con algunos otros caracteres de escape que le puede resultar útil

Para llevar a cabo la cadena de sustitución:

set temp=%1 
set temp=%temp:"=\"% 
echo %temp% 
+0

He editado la pregunta para mayor claridad – laggingreflex

+5

¿Qué pasa si% 1 es una ruta que contiene espacios? –

+0

¿Cuándo usa '" "' sobre '\" '? Encuentro que los archivos por lotes realmente solo escapan con' "" 'y la versión' \ "' es solo para programas no por lotes ('runas' codificados en C++ o algunos lenguaje que reconoce \ como un carácter de escape). Entonces, solo usamos '\" 'cuando pasamos variables a programas que no son por lotes y' "" 'cuando pasamos a otras secuencias de comandos por lotes (o funciones de proceso por lotes (por ejemplo, parámetro 'CALL: function') con '' EscapedQuote '') –

1
SET myPath=%1 
SET myPath=%myPath:"=\"% 
runas /user:abc "icacls %myPath% /grant Everyone:(F) /T" 

Editar - El nombre de la variable se cambió de path a myPath. PATH es una variable de sistema reservada que no debe usarse para nada más de lo que se pretendía.

+2

NO use "ruta" como su variable; está reservada para un propósito especial en Windows. Modificar el valor puede causar problemas más adelante en el script. Cambie el nombre de la variable de "ruta" a otra cosa, tal vez "mypath". Edita tu respuesta y luego puedo hasta votarla. – dbenham

0

En estos casos, ni siquiera es necesario buscar/reemplazar. Simplemente quite las citas originales de su argumento (con %~1) - luego puede agregar nuevamente lo que desee, p. las citas escapadas. En su ejemplo:

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T" 
5

Cada respuesta cubre parte de la respuesta. La combinación de ellos usando la barra invertida & cita: \" que se obtiene:

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T" 

o puede duplicado (doble) cita a escapar de ellos:

runas /user:abc "icacls ""%~1"" /grant Everyone:(F) /T" 

Como nota al margen ^ es ocasionalmente útil para escapar caracteres especiales como <, |, >, ||, && y & para e xample:

echo ^| 

pero esto es bastante raro.

+0

Doblar comillas dobles no funciona para mí, pero la barra invertida sí. – SerG

Cuestiones relacionadas