Usuario del software
2011-04-14 05:24:06 +0000 2011-04-14 05:24:06 +0000
15

Cómo pasar un argumento a una tarea programada de Windows con espacios

Necesito configurar una tarea programada de Windows. Acepta 1 parámetro/argumento que es una ruta y puede contener espacios. Mi tarea programada no funciona - "rompe" el parámetro en el primer espacio.

Si lo ejecuto en el Símbolo del sistema puedo envolver el argumento en " " y funciona bien, sin embargo, esto no funciona en la interfaz de usuario de la tarea programada.

por ejemplo, C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"

He intentado envolver el argumento con " " ' ' y he intentado rellenar los espacios con %20, ~1 etc. sin suerte.

Sé de una solución para hacer un archivo bat y usar " " alrededor de mi argumento pero no quiero añadir más complejidad.

Lo he probado en Windows 7 y en Windows 2008 Server y ambos han fallado. Parece que no hay discusiones sobre esto?

Respuestas [8]

6
2016-04-12 05:46:09 +0000
schtasks.exe /create /SC WEEKLY /D SUN /SD 11/12/2015 /ST 12:00:00 /TN "taskname" /TR "'c:\program files(x86)\task.exe' Arguments"

Obsérvese el uso de ' en la ruta de un archivo a ejecutar.

6
6
2011-05-19 20:24:00 +0000

He trabajado con tareas programadas y generalmente se ponen los argumentos en su propio cuadro de entrada de texto. Esto significa que apuntas la acción al campo de programa/script apunta al exe y el campo "Add Arguments" debe tener todos los parámetros.

Blog image

Creo que este comportamiento se añadió para evitar que los espacios en la ruta del archivo al exe causen problemas.

Yo hago esto todo el tiempo con los scripts de PowerShell. Aquí hay un ejemplo:

  • Programa/script: powershell.exe
  • Añadir argumentos : -comando "& 'C:\HSD - Copy\logoffstudents.ps1' " -NoInteractivo
  • Iniciar en: En blanco
6
3
2011-04-14 06:31:15 +0000

En este caso, puedes solucionar el problema pasando el parámetro de la ruta en formato 8.3.

Puede descubrir el formato 8.3 para su ruta abriendo una línea de comandos y emitiendo el comando dir /x en la raíz de su unidad.

Debería ver una entrada similar a

11/04/2011 12:10  PROGRA~1 Program Files

para su directorio de Archivos de Programa.

Luego cambie el directorio a Archivos de Programa con cd "Program Files" seguido de cd xyz y emita dir /x de nuevo para encontrar el nombre del formato 8.3 para "La Interfaz", y así sucesivamente.

Tu ruta final para el ejemplo que has dado sería algo así

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1
3
1
2013-10-27 22:45:45 +0000

Tuve un problema similar con VLC, que utilizaba en Windows XP. El truco consiste en encerrar el argumento del comando cmd entre comillas dobles.

He aquí un ejemplo de lo que utilicé (programar una grabación a las 15:00):

a las 15:00 cmd /c ""C:\Programmi\VideoLAN\VLC\vlc.exe dvb-t://frequency=698000000 :program=4006 :run-time=5 --sout "C:\Documents and Settings\UserName\Documents\Video\VLC\test.mpg""

Observe el uso de comillas dobles justo después de /c y al final del comando (después de .mpg). El argumento con espacios en este caso es "C:\Documents and Settings\..."

1
1
2017-02-15 13:27:49 +0000

Una forma de lograrlo es usando powershell desde la línea de comandos.

Agregue este código a un archivo llamado MyModule.psm1.

$TASK_STATE_UNKNOWN = 0;
$TASK_STATE_DISABLED = 1;
$TASK_STATE_QUEUED = 2;
$TASK_STATE_READY = 3;
$TASK_STATE_RUNNING = 4;
Function Run-Task(
        [ValidateNotNullOrEmpty()][string]
        [Parameter(Mandatory=$true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        $ComputerName, 
        [ValidateNotNullOrEmpty()][string]
        [Parameter(Mandatory=$true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        $Foldername, 
        [ValidateNotNullOrEmpty()][string]
        [Parameter(Mandatory=$true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        $Taskname, 
        [int] $maxwait = 0, 
        [string[]]
        [Parameter(Mandatory=$false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        $TaskParameters = $null
    ){
    $TaskScheduler = New-Object -ComObject Schedule.Service
    $TaskScheduler.Connect($ComputerName)
    $ScheduledTaskFolder = $TaskScheduler.GetFolder($Foldername)
    $ScheduledTask = $ScheduledTaskFolder.GetTask($TaskName)

    if(-not $ScheduledTask) {
        return $Null
    }

    $ScheduledTask.Enabled = $True
    $ScheduledTask.Run($TaskParameters)

    if($maxwait -gt 0){
        $seconds = 5
        $i = 0;
        Start-Sleep -Seconds $seconds
        while ($ScheduledTask.State -eq $TASK_STATE_RUNNING)
        {
            if(($i * $seconds) -gt $maxwait) { 
                break; 
            } 
            Start-Sleep -Seconds $seconds        
            $i++;
        }
    }
    return $ScheduledTask
}

Export-ModuleMember -Variable "TASK_STATE*"
Export-ModuleMember -Function "Run-*"

Luego desde la línea de comandos O un archivo ps1 podrías ejecutar:

Import-Module $(Get-Item .\MyModule.psm1 | Resolve-Path -Relative) -DisableNameChecking -Force

$task = Run-Task -ComputerName "$env:COMPUTERNAME" -Taskname "Foo" -Foldername "\" -TaskParameters "test", "Tim C", $(Get-Date -format G)

Cada elemento respectivo de la matriz de parámetros de la tarea se pasaría como $(Arg0), $(Arg1) y $(Arg2).

1
0
2014-04-28 13:52:02 +0000

Configure su tarea programada de la siguiente manera

cmd /c C:\gram Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\gram Files\xyz\The Interface\Folder Path"

0
0
2015-04-20 19:48:47 +0000

Podría ayudar a entender el problema desde una perspectiva diferente.. Digamos que eres el programador al que se le ha encargado añadir un programador de tareas a Windows. ¿Cómo lo harías? Tienes varios problemas a los que enfrentarte: Si la tarea se ejecuta como alguien que no es el usuario que ha iniciado la sesión, ¿debería molestar al usuario que ha iniciado la sesión con ventanas emergentes de error? ¿Qué pasa si no hay ningún usuario conectado en el momento en que se ejecuta la tarea? ¿Qué pasa con la diferencia entre un programa de GUI y un programa de consola? Las GUI no tienen stdin, stdout y stderr; el concepto no tiene sentido en ellas. ¿Qué pasa con los programas internos o externos a COMMAND.COM/CMD.EXE? ¿O de otros motores de scripting? ¿Qué pasa con las rutas con espacios en el nombre del comando? ¿O en los parámetros (opciones/argumentos)? (Como estás tratando de hacer ahora..)

Aunque no estoy 100% seguro de las interioridades o detalles técnicos completos en este caso, las respuestas parecen ser.. Las tareas se ejecutan en una sesión aislada, no interactiva, que no puede interactuar con el usuario actualmente conectado (si hay alguno); Se ejecuta esperando que no haya salida de consola, ya que es no interactiva, no puede interrumpir a cualquier usuario conectado para mostrar la salida, de todos modos (y si hay salida, stdin es el bitbucket/NULL, stdout y stderr se registran en la instalación de registro del sistema); Los espacios se manejan omitiendo la cuestión: el nombre del comando se toma EXACTAMENTE como es, y los parámetros que se pasan al comando se especifican en otro cuadro de entrada en las propiedades de la Tarea.

Lo que todo esto significa es que su tarea debe ejecutarse como si fuera un demonio (en el mundo Un*x). Todo es estático y preciso. El nombre del comando es el nombre real del comando, sin ningún parámetro. ¡Esto incluye a menudo la ejecución de intérpretes de comandos/script, como CMD.EXE! Los parámetros, si los hay, se especifican en otro lugar, y deben conocerse cuando se configura la tarea (es decir, no se pueden cambiar los parámetros "sobre la marcha"). Y así sucesivamente.

Por lo tanto, si quiere incluir parámetros, tiene que utilizar la sección de parámetros para especificarlos. El Programador de Tareas no trata de analizar el nombre del comando para dividirlo en "comando" y "argumentos" como hacen los programas de línea de comandos. Simplemente lo trata como un nombre de comando grande y completo. Asimismo, si desea parámetros variables, como el uso de %1 .. %n en los archivos BATCH, no puede hacerlo desde el propio Programador de Tareas; tendrá que encontrar otra forma. (Tenga en cuenta que tampoco puede utilizar variables de entorno, ya que el entorno que se pasa al programa depende del entorno con el que se inicia la tarea, NO del entorno "actual"). Podría utilizar un archivo temporal para guardar los parámetros, pero como debe especificar un nombre de archivo estático en las propiedades de la tarea, ¿qué sucede cuando está en una red con 5000 usuarios y cuatro de ellos intentan ejecutar la misma tarea al mismo tiempo? Todos ellos se golpearán entre sí tratando de escribir en el mismo archivo temporal al mismo tiempo, probablemente no es lo que usted quería, tampoco. (También hay soluciones a este problema, pero eso se sale del ámbito de esta pregunta y respuesta...)

Así que respuesta final: En el caso simple -- la ruta que quiere pasar como parámetro es estática y no cambia -- tiene que especificar los parámetros en la propiedad apropiada de la Tarea (Argumentos) en lugar de en la caja de Programa/Script, o usar un archivo por lotes. En un caso más complejo -- tendrás que hacer la pregunta adecuada o investigar cómo funcionan los demonios y cómo usar los bloqueos/semáforos y demás para la comunicación entre procesos (IPC).

Buena suerte.

0