Come passare un argomento a un'attività pianificata di Windows con spazi al suo interno


15

Devo impostare un'attività pianificata di Windows. Accetta 1 parametro / argomento che è un percorso e può contenere spazi. La mia attività pianificata non funziona: "interrompe" il parametro nel primo spazio.

Se lo eseguo nel prompt dei comandi, posso semplicemente racchiudere l'argomento in "" e funziona bene, tuttavia, ciò non funziona nell'interfaccia utente dell'attività pianificata.

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

Ho provato a racchiudere l'argomento con "" '' [] () e ho provato a riempire gli spazi con% 20, ~ 1 ecc. Senza fortuna.

Conosco una soluzione per creare un file bat e usare "" attorno al mio argomento, ma non voglio aggiungere più complessità.

L'ho provato su Windows 7 e Windows 2008 Server ed entrambi sono falliti. Sembra che non ci siano discussioni su questo?


1
Metti l'argomento nella sezione Programma / script o Aggiungi argomenti (facoltativo) quando modifichi l'attività pianificata?
William Jackson,

Sarebbe utile se hai specificato quale programma stai usando esattamente, poiché il corretto avvolgimento degli argomenti è a discrezione del programma e non dei Tak pianificati. WinSCP, ad esempio, prevede virgolette doppie ("" ... "") quando devi annidare le virgolette.
Tobias Plutat,

Non è abbastanza chiaro quanto a 1) cosa non vada a buon fine, all'attività o al file .exe e 2) esattamente cosa hai inserito e dove nell'interfaccia utente di TaskSched. Potrebbe essere che laddove TaskSched richieda un comando (percorso completo dell'eseguibile), stai provando a dargli una riga di comando (cosa molto diversa)?
kreemoweet,

Perché contro il file batch? Rende le cose così semplici! Oppure puoi girare per lo script PowerShell se ti senti avventuroso ..
tumchaaditya,

Risposte:


6

Ho lavorato con attività pianificate e generalmente metti gli argomenti nella sua casella di input di testo. Ciò significa che si punta l'azione sul campo programma / script e punta verso l'exe e il campo "Aggiungi argomenti" dovrebbe avere tutti i parametri. ( fonte )

Immagine del blog

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

Lo faccio sempre con gli script di PowerShell. Ecco un esempio:

  • Programma / script: powershell.exe
  • Aggiungi argomenti : -command "& 'C: \ HSD - Copy \ logoffstudents.ps1'" -NonInteractive
  • Inizia tra: vuoto

Grazie, ma il problema è che uno dei miei parametri è un percorso di file (e contiene uno spazio). Quindi nel tuo esempio 100 funzionerà, ma se volessi passare "C: \ Start Folder"?
Rodney,

Uso solo le virgolette nei miei programmi e funziona. La e commerciale è richiesta solo con PowerShell. Questo simbolo è l'operatore CALL e mi consente di visualizzare un comando PowerShell. Nella maggior parte dei casi, le citazioni sono tutto ciò che serve. A questo punto, potresti voler contattare il creatore dell'exe per vedere se supportano le attività pianificate. Ho incontrato alcuni rari programmi che si rifiutano di eseguire come attività pianificata. Penso che ci siano sottili differenze su come vengono passati i parametri che possono causare problemi. Mi dispiace non posso aiutare di più.
Doltknuckle,

Nel peggiore dei casi, è possibile ristrutturare la cartella per eliminare gli spazi. Non è quello che vuoi, ma potrebbe essere l'unico modo per farlo funzionare.
Doltknuckle,

Grazie Doltknuckle - So che potrei farlo anche con un file .bat (e usare "" attorno al parametro (come fai tu nello script Powershell. Sono sicuro che si tratta di un bug nell'interfaccia utente dell'editor di attività di Windows ... (I sono il creatore di .exe;) - Funziona bene attraverso un cablaggio di test e dal prompt dei comandi ma non attraverso l'interfaccia utente di Windows ...
Rodney

1
Se hai creato l'exe, questa potrebbe essere una domanda per StackOverflow. Ho la sensazione che potrebbe essere necessario modificare la gestione dei parametri quando questo exe viene utilizzato con attività pianificata. Un suggerimento è di fare in modo che il tuo exe registri i parametri ricevuti in un file in modo da poter vedere cosa viene passato. Ti permetterebbe almeno di vedere se i parametri dell'attività pianificata sono gli stessi dei parametri della riga di comando.
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"

Si noti l'uso di 'nel percorso di un file da eseguire.


3

In questo caso, è possibile aggirare il problema passando il parametro path in formato 8.3.

Puoi scoprire il formato 8.3 per il tuo percorso aprendo un prompt dei comandi ed eseguendo il comando dir /xnella radice dell'unità.

Dovresti vedere una voce simile a

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

per la directory dei file di programma.

Quindi cambiare la directory in Programmi con cd "Program Files"seguito da cd xyz ed emettere dir /xnuovamente per trovare il nome del formato 8.3 per" L'interfaccia ", e così via.

Il tuo percorso finale per l'esempio che hai dato sarebbe simile a:

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1

Grazie, apprezzo la risposta, tuttavia ciò causa ulteriori problemi. Fondamentalmente sto chiamando un'app EXE .NET che ho scritto che utilizza questo percorso della cartella param per qualcosa - non gli piace il formato 8.3 e non riesce a trovare il percorso. Quindi, c'è un altro modo per farlo?
Rodney,

ps - Quindi si tratta di un bug nell'app Task pianificato di Windows? Gli spazi sono molto comuni!
Rodney,

Un rapido test su Windows 7 funziona per me. Puoi guidarci attraverso i passaggi che hai intrapreso per impostare l'attività, come in vari modi. Grazie per la modifica lì Gareth, sembra molto più bello.
Keith,

Quindi l'attività funziona correttamente con questa formattazione, ma il mio programma .NET (che accetta il percorso come stringa arg) non decomprime il percorso dal formato 8.3. Quindi forse è una domanda di programmazione: come gestire i percorsi 8.3?
Rodney,

Conosco questo vecchio, ma hai provato il trattino (-)?
Chibueze Opata,

1

Ho avuto un problema simile con VLC, che stavo usando su Windows XP. Il trucco è racchiudere l'argomento del cmdcomando tra virgolette doppie.

Ecco un esempio di ciò che ho usato (programmare 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 \ nomeutente \ Documenti \ Video \ VLC \ test.mpg """

Nota l'uso delle virgolette doppie subito dopo /ce alla fine del comando (dopo .mpg). L'argomento con gli spazi in questo caso è"C:\Documents and Settings\..."


1

Un modo per farlo è usare PowerShell dalla riga di comando.

Aggiungi 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-*"

Quindi dalla riga di comando O un file ps1 è possibile 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 elemento corrispondente nell'array taskparameters verrebbe passato come $ (Arg0), $ (Arg1) e $ (Arg2).


0

Imposta l'attività pianificata come segue

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


0

Potrebbe aiutare a capire il problema da una prospettiva diversa. Supponiamo che tu sia il programmatore che è stato incaricato di aggiungere un programmatore di attività a Windows. Come lo faresti? Hai diversi problemi da affrontare: se l'attività viene eseguita come persona diversa dall'utente che ha effettuato l'accesso, dovresti infastidire l'utente che ha effettuato l'accesso con eventuali popup di errore? Che cosa succede se non ci sono utenti connessi al momento dell'esecuzione dell'attività? Che dire della differenza tra un programma GUI e un programma console? Le GUI non hanno stdin, stdout e stderr; il concetto non ha significato in loro. Che dire dei 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)? (Mentre stai cercando di affrontare ora ..)

Sebbene non sia sicuro al 100% degli interni o dei dettagli tecnici completi in questo caso, le risposte sembrano essere .. Le attività vengono eseguite in una sessione isolata, non interattiva, che non può interagire con l'utente attualmente connesso (se presente ); Viene eseguito aspettandosi che non ci sia alcun output della console, poiché non è interattivo, non può semplicemente interrompere qualsiasi utente connesso per mostrare l'output, comunque (e se c'è output, stdin è bitbucket / NULL, stdout e stderr vengono registrati su la funzione di registrazione del sistema); Gli spazi vengono gestiti ignorando il problema: il nome del comando viene preso ESATTAMENTE così com'è e i parametri passati al comando vengono specificati in un'altra casella di input nelle proprietà dell'attività.

Ciò che significa è che il tuo compito 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 parametri. Ciò include spesso l'esecuzione di interpreti di comandi / script, come CMD.EXE! I parametri, se presenti, sono specificati altrove e devono essere conosciuti quando si imposta l'attività (ovvero, non è possibile modificare i parametri "al volo"). E così via.

Quindi, se si desidera includere i parametri, è necessario utilizzare la sezione dei parametri per specificare i parametri. L'utilità di pianificazione non lo faprova ad analizzare il nome del comando per dividerlo in "comando" e "args" come fanno i programmi da riga di comando. Lo tratta solo come un grande nome di comando completo. Allo stesso modo, se vuoi parametri variabili, come usare% 1 ..% n nei file BATCH, non puoi farlo dallo stesso Utilità di pianificazione; Dovrai trovare un altro modo. (Si noti che non è possibile utilizzare le variabili di ambiente, poiché l'ambiente passato al programma dipende dall'ambiente con cui è stata avviata l'attività, NON dall'ambiente "corrente".) È possibile utilizzare un file temporaneo per salvare i parametri, ma poiché è necessario specificare un nome file statico nelle proprietà dell'attività, cosa succede quando ci si trova su una rete con 5000 utenti e quattro tentano di eseguire la stessa attività contemporaneamente? Si bloccheranno l'un l'altro cercando di scrivere nello stesso file temporaneo contemporaneamente, probabilmente neanche quello che volevi. (Esistono anche soluzioni a questo problema, ma questo va troppo al di fuori dell'ambito di questa domanda e risposta ..)

Quindi risposta finale: nel caso semplice - il percorso che si desidera passare come parametro è statico e non cambia - è necessario specificare i parametri nella proprietà Task appropriata (Argomenti) anziché nella casella Programma / Script o utilizzare un file batch. In un caso più complesso, dovrai porre la domanda giusta o fare ricerche su come funzionano i demoni e su come usare il blocco / semafori e simili per la comunicazione tra processi (IPC).

In bocca al lupo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.