2010-03-23 9 views
5

Tome un archivo por lotes terriblemente simple:acceso directo del administrador de archivos por lotes con los parámetros citados dobles

echo hi 
pause 

Guardar como que test.bat. Ahora, crea un atajo para test.bat. El acceso directo ejecuta el archivo por lotes, que imprime "hola" y luego espera una pulsación de tecla como se esperaba. Ahora, agregue algún argumento al objetivo del atajo. Ahora tiene un acceso directo a:

%path%\test.bat some args 

El acceso directo ejecuta el archivo por lotes como antes.

Ahora, ejecute el acceso directo como administrador. (Por cierto, esto está en Windows 7). Puede usar el botón derecho del ratón -> Ejecutar como administrador, o vaya a las propiedades del atajo y marque la casilla en la sección avanzada. Dile a UAC que está bien y una vez más el atajo ejecuta el archivo por lotes como se esperaba.

Ahora, cambiar los argumentos en el destino del acceso directo para agregar comillas dobles:

%path%\test.bat "some args" 

Ahora intenta el acceso directo como administrador. ¡No funciona esta vez! Aparece una ventana de comando y desaparece demasiado rápido para ver cualquier error. Intenté agregar> test.log 2> & 1 al acceso directo, pero no se crea ningún registro en este caso.

Intente ejecutar el mismo atajo (con las comillas dobles) pero no como administrador. Ejecuta bien el archivo por lotes. Por lo tanto, parece que el comportamiento no se debe a los parámetros de doble cita, y no es porque se ejecuta como administrador. Es una extraña combinación de los dos.

También intenté ejecutar el mismo comando desde la ventana de comandos de un administrador. Esto ejecutó el archivo por lotes como se esperaba sin error. Al ejecutar el acceso directo desde la ventana de comandos se generó una nueva ventana de comando que brilló y desapareció. Aparentemente, el problema es causado por una combinación de administrador, el acceso directo y las comillas dobles.

Estoy totalmente perplejo, ¿alguien tiene alguna idea de lo que está pasando? También me gustaría una solución.

+0

qué pasa cuando ejecuta el comando real en la línea de comando. '% path% \ test.bat" some args "'. ¿Qué viste? – ghostdog74

+0

cuando se ejecuta desde la línea de comandos, el archivo de proceso por lotes imprime "hola" y luego espera a que se presione la tecla, como era de esperar. – XXB

Respuesta

5

Acabo de funcionar el monitor de procesos en esto y esto es lo que vi:

Ejecutar como usuario:

cmd /c ""C:\Users\Sunbelt\Desktop\test.bat" "some args""

Ejecutar como administrador:

"C:\Windows\System32\cmd.exe" /C "C:\Users\Sunbelt\Desktop\test.bat" "some args"

Por alguna razón, el Run como caso de administración no está citando todo el comando. Parece que está intentando ejecutar el comando:

C:\Users\Sunbelt\Desktop\test.bat" "some args

yo supongo que desde el primer espacio se cita que en realidad tratando de ejecutar el siguiente comando:

"C:\Users\Sunbelt\Desktop\test.bat some" args

Y en el monitor de procesos registra existe una entrada del sistema de archivos de "NO TAL ARCHIVO" para "C: \ Users \ Sunbelt \ Desktop \ test.bat some". No sé por qué es diferente cuando se ejecuta como administrador, pero eso es lo que parece estar sucediendo.

+0

buena información, pero me encantaría tener algún tipo de trabajo alrededor ... – XXB

+0

No pude encontrar la manera de hacerlo. Traté de agregar citas en todo tipo de lugares, pero o bien el cuadro de diálogo de acceso directo no aceptaría esa entrada o resultó en los mismos accesos "NO TAL ARCHIVO". – Luke

3

Para evitar esto, cree otro archivo bat en un camino sin espacios y con un nombre de archivo sin espacios, que simplemente se hace esto:

call "Long path to original bat file\Original bat file.bat" 

Este archivo bat secundaria se puede ejecutar como administrador.

Ahora puede crear un acceso directo a este archivo secundario de bat y comprobar ejecutar como admin en las opciones avanzadas del acceso directo. El acceso directo se puede colocar en una ruta con espacios y puede tener un nombre de archivo que contenga espacios.

0

En mi caso, solo quiero pasar un nombre de archivo como parámetro, pero la ruta tiene espacios.

Encontré una solución que funcionó para este caso (si está bien truncar el nombre del archivo).

crear otro archivo bat (input_gate.bat) para eliminar los espacios en la ruta utilizando la sintaxis de CALL.exe. Suponiendo que el acceso directo se llama test.lnk y está en la misma ruta que el input_gate.bat:

call %~sdp0test.lnk %~sf1 

Este pase como parámetro para test.bat el nombre completo del archivo en formato corto, con privilegios de administrador.

  • % ~ sdp0 -> Es la ruta actual (para el input_gate.bat) en formato corto.
  • % ~ SF1 -> Es el primer parámetro pasado a input_gate.bat (en mi caso el nombre de archivo completo con espacios)
0

Esto funcionó para mí en Windows 7:

ShortcutTarget: C:\Windows\System32\cmd.exe /C myscript.bat Param1 "Param Two with spaces" 
StartIn:  "C:\Path containing\my script" 

no se ha probado todavía como administrador. No creo que funcione si myscript.bat contiene espacios

0

Finalmente lo descubrí, de una manera que permite el uso de nombres de archivo largos (los nombres de archivo cortos no eran adecuados para mi caso de uso). Mi solución funciona en Win 7, 8 y 10. Creo que fue inspirada por la mención de Luke de la comilla doble faltante.

Aquí está:

1.) Para el acceso directo se crea el fichero de lotes, lo que configura para funcionar como administrador, utilice la siguiente línea de comandos:

cmd /s /c ""path_to_batch_file" 

Nota que hay son 2 caracteres de comillas dobles al comienzo del comando, y solo 1 al final, aunque debería ser normalmente 2 al final también. ¡Pero ese es el truco para hacer que funcione!

2.) En el archivo por lotes, añadir de nuevo la falta de caracteres de doble cita:

set user_file=%1" 


Eso es todo! Aquí hay un ejemplo para que pueda verlo en acción:

1.) En su escritorio, cree "prueba".bat" con el siguiente contenido:.

@echo off 
set user_file=%1" 
echo The file is: %user_file% 
pause 

3.) Crear un acceso directo al archivo por lotes Conjunto para que se ejecute como administrador, y darle la siguiente línea de comandos:

cmd /s /c ""%userprofile%\desktop\test.bat" 

4.) arrastrar un archivo al acceso directo de éxito (espero ...)

Cuestiones relacionadas