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

15

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 ajustar el argumento en "" y funciona bien, sin embargo, esto no funciona en la IU de tareas programadas.

p.ej C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"

He intentado ajustar 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 agregar más complejidad.

Lo probé en Windows 7 y Windows 2008 Server y ambos fallaron. Parece que no hay discusiones sobre esto?

Rodney
fuente
1
¿Está poniendo el argumento en la sección Programa / script o en la sección Agregar argumentos (opcional) cuando edita la Tarea Programada?
William Jackson
Sería útil si especificara qué programa está utilizando exactamente, ya que el ajuste correcto de los argumentos queda a discreción del programa y no de Taks programados. WinSCP, por ejemplo, espera comillas dobles ("" ... "") cuando tiene que anidar comillas.
Tobias Plutat
No está bastante claro en cuanto a 1) qué está fallando, la tarea o su .exe, y 2) exactamente lo que ingresó y en qué parte de la interfaz de usuario de TaskSched. ¿Podría ser que donde TaskSched solicita un comando (ruta completa al ejecutable), está tratando de darle una línea de comando (algo muy diferente)?
kreemoweet
¿Por qué contra el archivo por lotes? ¡Hace las cosas tan simples! O puede disparar para el script de PowerShell si se siente aventurero ...
tumchaaditya

Respuestas:

6

He trabajado con tareas programadas y generalmente pones los argumentos en su propio cuadro de entrada de texto. Esto significa que apunta la acción al campo del programa / script apunta al exe y el campo "Agregar argumentos" debe tener todos los parámetros. ( fuente )

Imagen del blog

Creo que este comportamiento se agregó para evitar espacios en la ruta del archivo al exe que causa problemas.

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

  • Programa / script: powershell.exe
  • Agregue argumentos : -command "& 'C: \ HSD - Copy \ logoffstudents.ps1'" -NonInteractive
  • Comience en: en blanco
Doltknuckle
fuente
Gracias, pero el problema es que uno de mis parámetros ES una ruta de archivo (y tiene un espacio). Entonces, en su ejemplo, 100 funcionará, pero ¿qué sucede si desea pasar "C: \ Start Folder"?
Rodney
Solo uso comillas en mis programas y funciona. El ampersand solo se requiere con powershell. Este símbolo es el operador CALL y me permite mostrar un comando de PowerShell. En la mayoría de los casos, las cotizaciones son todo lo que necesita. En este punto, es posible que desee consultar al creador del exe para ver si admiten tareas programadas. Me he encontrado con algunos programas raros que simplemente se niegan a ejecutarse como una tarea programada. Creo que hay diferencias sutiles en cómo se pasan los parámetros que pueden causar problemas. Lo siento, no puedo ayudar más.
Doltknuckle
En el peor de los casos, puede reestructurar la carpeta para eliminar los espacios. No es lo que quieres, pero podría ser la única forma de hacerlo funcionar.
Doltknuckle
Gracias Doltknuckle: sé que también podría hacerlo con un archivo .bat (y usar "" alrededor del parámetro (como lo hace en el script Powershell. Estoy seguro de que es un error en la interfaz de usuario del editor de tareas de Windows ...) soy el creador del .exe;) - Funciona bien a través de un arnés de prueba y desde el símbolo del sistema, pero no a través de la interfaz de usuario de Windows ...
Rodney
1
Si realizó el exe, esta puede ser una pregunta para stackoverflow. Tengo la sensación de que es posible que necesite modificar su manejo de parámetros cuando este exe se utiliza con la tarea programada. Una sugerencia es que su exe ejecute los parámetros recibidos en un archivo para que pueda ver lo que se está pasando. Al menos le permitiría ver si los parámetros de la tarea programada son los mismos que los parámetros de la línea de comandos.
Doltknuckle
6
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"

Tenga en cuenta el uso de 'en la ruta de un archivo a ejecutar.

Aman Mehra
fuente
3

En este caso, podría solucionar el problema pasando el parámetro de ruta en formato 8.3.

Puede descubrir el formato 8.3 para su ruta abriendo un símbolo del sistema y emitiendo el comando dir /xen la raíz de su unidad.

Deberías ver una entrada similar a

11/04/2011  12:10    <DIR>          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 /xnuevamente para encontrar el nombre del formato 8.3 para" La interfaz ", y así sucesivamente.

Su ruta final para el ejemplo que dio se vería así:

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1
Keith
fuente
Gracias, agradezco la respuesta, sin embargo, esto causa más problemas. Básicamente, estoy llamando a una aplicación EXE .NET que escribí que usa esta ruta de carpeta param para algo: no le gusta el formato 8.3 y no puede encontrar la ruta. Entonces, ¿hay alguna otra forma de hacerlo?
Rodney
ps: ¿Entonces esto es un error en la aplicación Tarea Programada de Windows? Los espacios son muy comunes!
Rodney
Una prueba rápida en Windows 7 me funciona. ¿Puede guiarnos a través de los pasos que siguió para configurar la tarea, así como de varias maneras? Gracias por la edición allí Gareth, se ve mucho mejor.
Keith
Entonces, la tarea se ejecuta bien con este formato, pero luego mi programa .NET (que acepta la ruta como una cadena arg) no descomprime la ruta del formato 8.3. Entonces, tal vez es una pregunta de programación: ¿cómo manejar las rutas 8.3?
Rodney
Sé que esto es viejo, pero ¿probaste el guión (-)?
Chibueze Opata
1

Tuve un problema similar con VLC, que estaba usando en Windows XP. El truco es encerrar el argumento del cmdcomando entre comillas dobles.

Aquí hay un ejemplo de lo que usé (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 "" "

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

tomatoma
fuente
1

Una forma de lograr esto 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 comando O un archivo ps1, puede 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 en la matriz de parámetros de tareas se pasaría como $ (Arg0), $ (Arg1) y $ (Arg2).

SpaceGhost440
fuente
0

Configure su tarea programada de la siguiente manera

cmd / c C: \ Archivos de programa \ xyz \ FTP File Transfer \ FTPFileTransferTask.exe "C: \ Archivos de programa \ xyz \ The Interface \ Folder Path"

incógnito
fuente
0

Podría ayudar a comprender el problema desde una perspectiva diferente. Digamos que usted es el programador a quien se le ha encargado agregar un programador de tareas a Windows. ¿Como lo harias? Tiene varios problemas con los que lidiar: si la tarea se ejecuta como alguien que no sea el usuario conectado, ¿debería molestar al usuario conectado con alguna ventana emergente de error? ¿Qué sucede si no hay un usuario conectado en el momento en que se ejecuta la tarea? ¿Qué pasa con la diferencia entre un programa GUI y un programa de consola? Las GUI no tienen stdin, stdout y stderr; el concepto no tiene sentido en ellos. ¿Qué pasa con los programas internos o externos a COMMAND.COM/CMD.EXE? ¿U otros motores de secuencias de comandos? ¿Qué pasa con las rutas con espacios en el nombre del comando? ¿O en los parámetros (opciones / argumentos)? (Como estás tratando de lidiar ahora ...)

Si bien no estoy 100% seguro acerca de los detalles internos o 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 corresponde). ); Se ejecuta esperando que no haya salida de la consola, ya que no es interactivo, 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 evitando el problema: el nombre del comando se toma EXACTAMENTE tal como está y los parámetros que se pasan al comando se especifican en otro cuadro de entrada en las propiedades de la tarea.

Lo que 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 a menudo incluye la ejecución de intérpretes de comandos / scripts, como CMD.EXE! Los parámetros, si los hay, se especifican en otra parte y deben conocerse cuando configura la tarea (es decir, no puede cambiar los parámetros "sobre la marcha"). Y así.

Entonces, si desea incluir parámetros, debe usar la sección de parámetros para especificar los parámetros. El programador de tareas nointente analizar el nombre del comando para dividirlo en "comando" y "argumentos" como lo hacen los programas de línea de comandos. Simplemente lo trata como un gran nombre de comando completo. Del mismo modo, si desea parámetros variables, como usar% 1 ..% n en archivos BATCH, no puede hacerlo desde el Programador de tareas; Tendrás que encontrar otra manera. (Tenga en cuenta que tampoco puede usar variables de entorno, ya que el entorno pasado al programa depende del entorno con el que se inicia la tarea, NO del entorno "actual"). Puede usar un archivo temporal para guardar los parámetros, pero ya que 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 se golpean entre sí tratando de escribir en el mismo archivo temporal al mismo tiempo, probablemente tampoco lo que querías. (También hay soluciones a este problema, pero eso va demasiado lejos del alcance de esta pregunta y respuesta ...)

Entonces, la respuesta final: en el caso simple, la ruta que desea pasar como parámetro es estática y no cambia, debe especificar los parámetros en la propiedad de Tarea apropiada (Argumentos) en lugar de en el cuadro Programa / Script , o use un archivo por lotes. En un caso más complejo, deberá hacer la pregunta correcta o investigar cómo funcionan los demonios y cómo usar el bloqueo / semáforos y demás para la comunicación entre procesos (IPC).

Buena suerte.

CM
fuente