2011-04-14 05:24:06 +0000 2011-04-14 05:24:06 +0000
15
15

Come passare un argomento a un'attività pianificata di Windows con degli spazi

Ho bisogno di impostare un'attività pianificata di Windows. Accetta 1 parametro/argomento che è un percorso e può contenere spazi. Il mio compito programmato non funziona - “rompe” il parametro al primo spazio.

Se lo eseguo nel Prompt dei comandi posso semplicemente avvolgere l'argomento in “ ” e funziona bene, tuttavia, questo non funziona nell'interfaccia utente di Scheduled Task.

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

Ho provato ad avvolgere l'argomento con “ ” ‘ ’ e ho provato a riempire gli spazi con %20, ~1 ecc. senza fortuna.

So di una soluzione per fare un file bat e usare “ ” intorno al mio argomento ma non voglio aggiungere ulteriore complessità.

Ho provato su Windows 7 e Windows 2008 Server ed entrambi hanno fallito. Sembra che non ci siano discussioni su questo?

Risposte (8)

6
6
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"

Nota l'uso di ' nel percorso di un file da eseguire.

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

Ho lavorato con i compiti programmati e generalmente si mettono gli argomenti nella propria casella di testo. Questo significa che si punta l'azione al campo programma/script punta all'exe e il campo “Add Arguments” dovrebbe avere tutti i parametri. (http://technet.microsoft.com/en-us/library/cc770904.aspx))

Credo che questo comportamento sia stato aggiunto per evitare che gli spazi nel percorso del file dell'exe causino problemi.

Lo faccio spesso con gli script PowerShell. Ecco un esempio:

  • Programma/script: powershell.exe
  • Aggiungi argomenti : -comando “& ‘C:\HSD - Copy\logoffstudents.ps1’ ” -NonInterattivo
  • Avvio in: Vuoto
3
3
3
2011-04-14 06:31:15 +0000

In questo caso, potreste aggirare il problema passando il parametro del vostro percorso nel formato 8.3.

Puoi scoprire il formato 8.3 per il tuo percorso aprendo un prompt dei comandi e dando il comando dir /x nella root del tuo disco.

Dovresti vedere una voce simile a

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

per la tua directory Program Files.

Poi cambiate la directory Program Files con cd "Program Files“ seguito da cd xyz e digitate ancora dir /x per trovare il nome del formato 8.3 per "The Interface”, e così via.

Il tuo percorso finale per l'esempio che hai dato sarebbe qualcosa come:

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

Ho avuto un problema simile con VLC, che stavo usando su Windows XP. Il trucco è quello di racchiudere l'argomento del comando cmd tra doppi apici.

Ecco un esempio di quello che ho usato (programmando una registrazione alle 15:00):

alle 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”“

Notate l'uso dei doppi apici subito dopo /c e alla fine del comando (dopo .mpg). L'argomento con spazi in questo caso è "C:\Documents and Settings\..."

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

Un modo per farlo è usare powershell dalla linea di comando.

Aggiungete questo codice a un file chiamato 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-*"

Poi dalla riga di comando o da un file ps1 si potrebbe eseguire:

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)

Ogni rispettivo elemento nell'array taskparameters verrebbe passato come $(Arg0), $(Arg1), e $(Arg2).

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

Imposta il tuo compito programmato come segue

cmd /c C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe “C:\Program Files\xyz\The Interface\Folder Path”

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

Potrebbe aiutare a capire il problema da una prospettiva diversa. Diciamo che tu sei il programmatore che è stato incaricato di aggiungere un task scheduler a Windows. Come lo fareste? Avete diversi problemi da affrontare: Se il compito viene eseguito come qualcuno diverso dall'utente loggato, dovreste infastidire l'utente loggato con qualche popup di errore? Cosa succede se non c'è un utente loggato nel momento in cui il task viene eseguito? E la differenza tra un programma GUI e un programma da console? Le GUI non hanno stdin, stdout e stderr; il concetto non ha senso in esse. E i programmi interni o esterni a COMMAND.COM/CMD.EXE? O altri motori di scripting? Che dire dei percorsi con spazi nel nome del comando? O nei parametri (opzioni/argomenti)? (Come stai cercando di fare ora..)

Mentre non sono sicuro al 100% degli interni o dei dettagli tecnici completi in questo caso, le risposte sembrano essere. I task vengono eseguiti in una sessione isolata, non interattiva, che non può interagire con l'utente attualmente loggato (se c'è); Viene eseguito aspettandosi che non ci sia alcun output di console, poiché è non interattivo, non può semplicemente interrompere qualsiasi utente loggato per mostrare l'output, in ogni caso (e se c'è output, stdin è il bitbucket/NULL, stdout e stderr vengono registrati nella struttura di logging del sistema); Gli spazi vengono gestiti bypassando il problema: il nome del comando è preso ESATTAMENTE così com'è, e i parametri sono passati al comando sono specificati in un'altra casella di input nelle proprietà del Task.

Ciò che significa è che il vostro task deve essere eseguito come se fosse un demone (nel mondo Un*x). Tutto è statico e preciso. Il nome del comando è il nome effettivo del comando, senza alcun parametro. Questo spesso include l'esecuzione di interpreti di comandi/script, come CMD.EXE! I parametri, se ce ne sono, sono specificati altrove, e devono essere noti quando si imposta il compito (cioè, non si possono cambiare i parametri “al volo”). E così via.

Quindi, se volete includere dei parametri, dovete usare la sezione dei parametri per specificarli. Il Task Scheduler non cerca di analizzare il nome del comando per dividerlo in “command” e “args” come fanno i programmi a riga di comando. Lo tratta semplicemente come un grande nome di comando completo. Allo stesso modo, se volete parametri variabili, come usare %1 .. %n nei file BATCH, non potete farlo dal Task Scheduler stesso; dovrete trovare un altro modo. (Notate che non potete nemmeno usare variabili d'ambiente, poiché l'ambiente passato al programma dipende dall'ambiente con cui il task viene avviato, NON dall'ambiente “attuale”). Potresti usare un file temporaneo per salvare i parametri, ma dato che devi specificare un nome di file statico nelle proprietà del task, cosa succede quando sei su una rete con 5000 utenti e quattro di loro cercano di eseguire lo stesso task allo stesso tempo? Si scontreranno tutti tra loro cercando di scrivere sullo stesso file temporaneo nello stesso momento, probabilmente non è quello che volevi. (Ci sono anche soluzioni a questo problema, ma questo va troppo oltre lo scopo di questa domanda e risposta…)

Quindi risposta finale: Nel caso semplice – il percorso che vuoi passare come parametro è statico e non cambia – devi o specificare i parametri nella proprietà appropriata di Task (Arguments) piuttosto che nella casella Program/Script, o usare un file batch. In un caso più complesso – dovrai fare la domanda giusta o ricercare come funzionano i demoni e come usare locking/semaphores e simili per la comunicazione tra processi (IPC).

Buona fortuna.

-1
-1
-1
2019-06-27 16:39:40 +0000

Microsoft ha un bollettino su questo https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

Fondamentalmente dice di usare la sequenza “\” prima e dopo il nome del file batch.