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

Hoe geef ik een argument door aan een Windows geplande taak met spaties erin

Advertisement

Ik moet een Windows Geplande Taak opzetten. Het accepteert 1 parameter/argument dat een pad is en spaties kan bevatten. Mijn Scheduled task werkt niet - het “breekt” de parameter af bij de eerste spatie.

Als ik het in de Opdrachtprompt uitvoer, kan ik het argument in “ ” wikkelen en werkt het prima, maar dit werkt niet in de UI van de Geplande Taak.

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

Ik heb geprobeerd het argument te omwikkelen met “ ” ‘ en heb geprobeerd de spaties in te vullen met %20, ~1 enz. zonder succes.

Ik weet van een oplossing om een bat bestand te maken en “ ” rond mijn argument te gebruiken, maar ik wil niet nog meer complexiteit toevoegen.

Ik heb het geprobeerd op Windows 7 en Windows 2008 Server en beide faalden. Er schijnen geen discussies over dit te zijn?

Advertisement
Advertisement

Antwoorden (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"

Let op het gebruik van ' in het pad van een bestand dat moet worden uitgevoerd.

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

Ik heb gewerkt met geplande taken en over het algemeen zet je de argumenten in een eigen tekst invoerveld. Dit betekent dat je de actie wijst naar het programma/script veld wijst naar de exe en het “Add Arguments” veld zou alle parameters moeten hebben. bron ](http://technet.microsoft.com/en-us/library/cc770904.aspx))

Ik geloof dat dit gedrag werd toegevoegd om te voorkomen dat spaties in het bestandspad naar de exe problemen veroorzaken.

Ik doe dit de hele tijd met PowerShell scripts. Hier is een voorbeeld:

  • Programma/script: powershell.exe
  • Voeg argumenten toe : -command “& ‘C:\HSD - Copylogoffstudents.ps1’ ” -Non-Interactive
  • Start in: Blanco
3
Advertisement
3
3
2011-04-14 06:31:15 +0000
Advertisement

In dit geval kunt u het probleem omzeilen door uw padparameter in 8.3-formaat door te geven.

U kunt de 8.3-indeling voor uw pad achterhalen door een opdrachtprompt te openen en het commando dir /x uit te voeren in de root van uw schijf.

U zou een vermelding moeten zien die lijkt op

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

voor uw Program Files directory.

Verander dan de directory naar Program Files met cd "Program Files“ gevolgd door cd xyz en geef opnieuw dir /x om de 8.3 format naam voor "The Interface” te vinden, enzovoort.

Je uiteindelijke pad voor het voorbeeld dat je gaf zou er ongeveer zo uitzien:

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

Ik had een soortgelijk probleem met VLC, dat ik gebruikte op Windows XP. De truc is om het argument van het cmd commando tussen dubbele aanhalingstekens te zetten.

Hier is een voorbeeld van wat ik gebruikte (een opname plannen om 15:00):

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

Let op het gebruik van dubbele aanhalingstekens net na /c en aan het eind van het commando (na .mpg). Het argument met spaties is in dit geval "C:\Documents and Settings\..."

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

Een manier om dit te bereiken is met Powershell vanaf de commandoregel.

Voeg deze code toe aan een bestand genaamd 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-*"

Dan zou je vanaf de commandoregel OF een ps1 bestand kunnen uitvoeren:

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)

Elk item in de taskparameters array zou worden doorgegeven als $(Arg0), $(Arg1), en $(Arg2).

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

Stel uw geplande taak als volgt in

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

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

Het helpt misschien om het probleem vanuit een ander perspectief te bekijken… Stel dat jij de programmeur bent die de taak heeft gekregen om een taakplanner aan Windows toe te voegen. Hoe zou u dat doen? Je hebt met verschillende problemen te kampen: Als de taak wordt uitgevoerd als iemand anders dan de ingelogde gebruiker, moet je de ingelogde gebruiker dan lastig vallen met eventuele foutmeldingen? Wat als er geen ingelogde gebruiker is op het moment dat de taak wordt uitgevoerd? Hoe zit het met het verschil tussen een GUI programma en een console programma? GUI’s hebben geen stdin, stdout en stderr; het concept is bij hen zinloos. Hoe zit het met programma’s binnen of buiten COMMAND.COM/CMD.EXE? Of andere scripting engines? Hoe zit het met paden met spaties in de opdrachtnaam? Of in de parameters (opties/argumenten)? (Zoals je nu probeert aan te pakken..)

Hoewel ik niet 100% zeker ben van de internals of de volledige technische details in dit geval, lijken de antwoorden te zijn… Taken worden uitgevoerd in een geïsoleerde, niet-interactieve sessie, die geen interactie kan hebben met de huidige ingelogde gebruiker (als die er is); Het wordt uitgevoerd in de verwachting dat er geen console-uitvoer is, omdat het niet-interactief is, kan het niet zomaar een ingelogde gebruiker onderbreken om de uitvoer te laten zien, hoe dan ook (en als er uitvoer is, is stdin de bitbucket/NULL, stdout en stderr worden gelogd naar de systeem logging faciliteit); Spaces worden afgehandeld door het probleem te omzeilen: de opdrachtnaam wordt EXACTIEF genomen zoals hij is, en de parameters die aan de opdracht worden doorgegeven, worden in een ander invoerveld in de taakeigenschappen opgegeven.

Wat dit alles betekent is dat je taak moet worden uitgevoerd alsof het een daemon is (in de Un*x wereld). Alles is statisch en precies. De opdrachtnaam is de eigenlijke opdrachtnaam, zonder enige parameters. Dit omvat vaak het uitvoeren van commando/script interpreters, zoals CMD.EXE! De parameters, indien aanwezig, worden elders gespecificeerd, en moeten bekend zijn wanneer je de opdracht opzet (dat wil zeggen, je kunt de parameters niet “on-the-fly” veranderen). En zo verder.

Dus, als je parameters wilt opnemen, moet je de parameters sectie gebruiken om de parameters op te geven. De Taakplanner probeert niet de commandonaam te ontleden en op te splitsen in “commando” en “args” zoals commandoregelprogramma’s doen. Hij behandelt het gewoon als één grote, volledige opdrachtnaam. Ook als je variabele parameters wilt, zoals %1 .. %n in BATCH-bestanden, kun je dat niet vanuit de Taakplanner zelf doen; je zult een andere manier moeten vinden. (Merk op dat je ook geen omgevingsvariabelen kunt gebruiken, omdat de omgeving die aan het programma wordt doorgegeven afhankelijk is van de omgeving waarmee de taak wordt gestart, NIET van de “huidige” omgeving). U zou een tijdelijk bestand kunnen gebruiken om de parameters op te slaan, maar omdat u een statische bestandsnaam moet opgeven in de taakeigenschappen, wat gebeurt er als u op een netwerk zit met 5000 gebruikers en vier van hen proberen dezelfde taak op hetzelfde moment uit te voeren? Ze zullen elkaar allemaal platdrukken bij het schrijven naar hetzelfde tijdelijke bestand op hetzelfde moment, waarschijnlijk ook niet wat je wilde. (Er zijn ook oplossingen voor dit probleem, maar dat gaat te ver buiten het bestek van deze vraag en dit antwoord…)

Dus het laatste antwoord: In het eenvoudige geval – het pad dat je als parameter wil doorgeven is statisch en verandert niet – moet je ofwel de parameters specificeren in de juiste Task eigenschap (Arguments) in plaats van in het Program/Script vak, of een batch bestand gebruiken. In een complexer geval – zul je de juiste vraag moeten stellen of onderzoeken hoe daemons werken en hoe je locking/semaphores en dergelijke kunt gebruiken voor inter-proces communicatie (IPC).

Veel geluk.

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

Microsoft heeft hier een bulletin over https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

In principe staat er dat je de sequentie “\” moet gebruiken voor en na de naam van het batch bestand.

Advertisement

Gerelateerde vragen

3
19
10
28
7
Advertisement