2011-05-26 10 views
6

Tengo varias aplicaciones que tiendo a necesitar abrir al mismo tiempo, y en lugar de depender únicamente de la carpeta Inicio para iniciarlas al mismo tiempo (y para poder volver a abrirlos todos si algunos se cerraron en algún momento del día) Creé una carpeta llena de accesos directos de forma similar a los enlaces de inicio de nivel de ejecución de Linux. Así, en la carpeta que tengo enlaces de acceso directo similares a:Ejecutar enlaces de acceso directo desde un archivo por lotes y no esperar a que la aplicación salga

  • S00 - Outlook.lnk
  • S01 - Notepad ++ LNK
  • S02 - Chrome.lnk
  • S03 - Skype.lnk
.

Creé un archivo por lotes que recorrerá todos los enlaces que coinciden con el formato de nombres y los ejecutará. El contenido del archivo por lotes que actualmente es:

@FOR /F "usebackq delims==" %%f IN (`dir /b "S* - *.lnk"`) DO "%%f" 

Se pondrá en marcha la mayoría de los enlaces que trato muy bien, pero algunos pondrá en marcha y esperar a que el proceso para salir, evitando así que sigan las secuencias de comandos de apertura. ¿Hay alguna forma de ejecutar los accesos directos sin esperar a que los procesos salgan dentro del archivo por lotes? ¿O es una causa perdida y debería buscar una solución Powershell en su lugar?

cosas que he intentado hasta ahora:

  • cambiar el contenido de

    @FOR /F "usebackq delims==" %%f IN (`dir /b "S* - *.lnk"`) DO START /B /I "%%f" 
    

    Se pone en marcha la línea de comandos en un proceso en segundo plano, pero en realidad nunca lanza el destino del enlace.

  • cambiar el contenido de

    @FOR /F "usebackq delims==" %%f IN (`dir /b "S* - *.lnk"`) DO %comspec% /k "%%f" 
    

    Se pone en marcha el primer eslabón, pero espera.

Respuesta

7

dcp's answer apuntó en la dirección correcta intentándolo sin la bandera /B, pero no fue la solución. Aparentemente, START tomará la primera cadena entrecomillada, independientemente del orden de los parámetros que se le pase, como el título de la nueva ventana en lugar de asumir que es el ejecutable/comando. Por lo tanto, cuando se iniciaron los procesos START, tenían los enlaces de acceso directo como el título de la ventana, y el directorio de inicio era el directorio de trabajo del archivo principal de proceso por lotes. Así que he actualizado mi archivo a archivo por lotes para la siguiente y funciona:

@FOR /F "usebackq delims==" %%f IN (`dir /b "S* - *.lnk"`) DO START /B /I "TITLE" "%%f" 
7

trate de la primera manera, pero tomar la /B fuera del comando START. De esta forma, el proceso se iniciará en una nueva ventana, por lo que no debe esperar.

Con/B, se iniciará el proceso en la misma ventana. Entonces, si ese proceso se bloquea por alguna razón, no podrás recuperar el control hasta que termine. Por ejemplo, considere el siguiente archivo por lotes, foo.bat (se necesita orden de sueño para esto, tengo cygwin por lo que viene con eso):

echo hi 
sleep 5 

Desde un símbolo del sistema, si escribe

START /B foo.bat 

notará que el control no volverá al símbolo del sistema hasta que termine la suspensión. Sin embargo, si hacemos esto:

START foo.bat 

entonces el control vuelve inmediatamente (porque foo.bat se inicia en una nueva ventana), que es lo que desea.

+0

Una cosa a tener en cuenta sobre 'foo.bat' START es si otro guión (' decir bar.bat') llama se mantendrá " activo "hasta que' foo.bat' termine de ejecutarse. Entonces, si su 'foo.bat' es un script de bucle que bloquea los recursos,' bar.bat' estará "en uso" y bloqueará recursos (incluso si 'bar.bat' está cerrado) hasta que 'foo.bat' se cierre . – Zero

Cuestiones relacionadas