İçinde boşluk bulunan bir Windows Zamanlanmış Göreve bağımsız değişken nasıl aktarılır


15

Bir Windows Zamanlanmış Görev ayarlamam gerekiyor. Bir yol olan ve boşluk içerebilen 1 parametre / bağımsız değişkeni kabul eder. Zamanlanan görevim çalışmıyor - ilk boşlukta parametreyi "keser".

Eğer Komut İstemi'nde çalıştırırsam, sadece argümanı "" içine sarabilirim ve iyi çalışır, ancak bu, Zamanlanmış Görev kullanıcı arayüzünde çalışmaz.

Örneğin C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"

Argümanı "" '' [] () ile kaydırmayı denedim ve% 20, ~ 1 vb. İle boşlukları şanssız doldurmayı denedim.

Bir yarasa dosyası yapmak ve "" benim argüman etrafında kullanmak için bir çözüm biliyorum ama daha fazla karmaşıklık eklemek istemiyorum.

Windows 7 ve Windows 2008 Server'da denedim ve her ikisi de başarısız oldu. Bu konuda tartışma yok gibi görünüyor mu?


1
Zamanlanmış Görevi düzenlerken bağımsız değişkeni Program / komut dosyası bölümüne veya Bağımsız değişken ekle (isteğe bağlı) bölümüne mi koyuyorsunuz ?
William Jackson

Tam olarak hangi programı kullandığınızı belirtmeniz yararlı olacaktır, çünkü argümanların doğru kaydırılması Programlanmış Taks yerine programın takdirindedir. Örneğin WinSCP, tırnakları yerleştirmeniz gerektiğinde çift tırnaklar ("" ... "") bekler.
Tobias Plutat

1) neyin başarısız olduğu, görev veya .exe'niz ve 2) tam olarak ne girdiğinizi ve TaskSched UI'de oldukça belirsizdir. TaskSched'un bir komut istediği (yürütülebilir yolun tam yolu), ona bir komut satırı (çok farklı bir şey) vermeye çalıştığınız olabilir mi?
kreemoweet

Neden toplu iş dosyasına karşı? İşleri bu kadar basit hale getiriyor! Veya maceracı hissediyorsanız powershell senaryosu için çekim yapabilirsiniz ..
tumchaaditya

Yanıtlar:


6

Zamanlanmış görevlerle çalıştım ve genellikle bağımsız değişkenleri kendi metin giriş kutusuna koydunuz. Bu, eylemi programa / komut dosyası alanına, exe'ye işaret ettiğiniz ve "Bağımsız Değişken Ekle" alanının tüm parametrelere sahip olması gerektiği anlamına gelir. ( kaynak )

Blog resmi

Bu davranış exe dosya yolu boşlukları önlemek için sorunlara neden eklendi eklendi.

Bunu her zaman PowerShell betikleriyle yapıyorum. İşte bir örnek:

  • Program / script: powershell.exe
  • Bağımsız değişkenler ekleyin : -command "& 'C: \ HSD - Kopyala \ logoffstudents.ps1'" -NonInteractive
  • Başlangıç ​​yeri: Boş

Teşekkürler, ama sorun şu ki benim paramaters biri dosya yolu IS (ve içinde bir boşluk var). Öyleyse 100 örneğinizde çalışır, ancak "C: \ Start Folder" ı geçmek isteseniz ne olur?
Rodney

Programlarımda tırnak işaretleri kullanıyorum ve işe yarıyor. Ve işareti yalnızca powershell için gereklidir. Bu sembol CALL operatörüdür ve bir powershell komutu getirmeme izin verir. Çoğu durumda, tek ihtiyacınız olan tırnak. Bu noktada, zamanlanmış görevleri destekleyip desteklemediklerini görmek için exe'nin yaratıcısıyla iletişime geçmek isteyebilirsiniz. Zamanlanmış bir görev olarak çalışmayı reddeden birkaç nadir programla karşılaştım. Parametrelerin nasıl aktarıldığına dair sorunlara neden olabilecek küçük farklılıklar olduğunu düşünüyorum. Üzgünüm, daha fazla yardım edemem.
Doltknuckle

En kötüsü, boşlukları ortadan kaldırmak için klasörü yeniden yapılandırabilirsiniz. İstediğiniz bu değil, ancak çalışmasını sağlamanın tek yolu olabilir.
Doltknuckle

Teşekkürler Doltknuckle - Ben de bir .bat dosyası ile yapabilirim (ve param etrafında "" kullanın (Powershell betiğinde yaptığınız gibi.) Windows Görev editörü kullanıcı arayüzünde bir hata olduğundan eminim ... (I .exe'in yaratıcısıyım;) - Bir test koşumuyla ve komut isteminden iyi çalışıyor, ancak Windows UI aracılığıyla çalışmıyor ...
Rodney

1
Eğer exe yaptıysanız, bu stackoverflow için bir soru olabilir. Bu exe zamanlanmış görevle kullanıldığında parametre işleme değiştirmeniz gerekebilir bir duygu var. Bir öneri, exe'nizin bir dosyaya alınan parametreleri günlüğe kaydetmesini sağlamaktır, böylece ne geçildiğini görebilirsiniz. En azından zamanlanmış görev parametrelerinin komut satırı parametreleriyle aynı olup olmadığını görmenize izin verir.
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"

'Çalıştırılacak bir dosyanın yolundaki kullanımına dikkat edin.


3

Bu durumda, path parametrenizi 8.3 biçiminde ileterek soruna geçici bir çözüm bulabilirsiniz.

Komut istemini dir /xaçıp sürücünüzün kök dizininde komutu vererek yolunuz için 8.3 biçimini keşfedebilirsiniz .

Şuna benzer bir giriş görmelisiniz:

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

Program Dosyaları dizininiz için.

Ardından dizini Program Files olarak cd "Program Files"ve ardından cd xyz olarak değiştirin ve dir /x" Arabirim "için 8.3 biçim adını bulmak üzere yeniden yayınlayın .

Verdiğiniz örnek için son yolunuz şöyle görünecektir:

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

Teşekkürler, cevabını takdir ediyorum, ancak bu daha fazla soruna neden oluyor. Temelde bir şey için bu param klasör yolunu kullanan yazdım bir EXE .NET uygulaması arıyorum - 8.3 biçimini sevmez ve yolu bulamıyor. Peki, bunu yapmanın başka bir yolu var mı?
Rodney

ps - Peki bu Windows Zamanlanmış Görev app bir hata mı? Mekanlar çok yaygın!
Rodney

Windows 7'de hızlı bir test benim için çalışıyor. Görevi ayarlamak için attığınız adımlar boyunca, çeşitli yollar gibi bize yürüyebilir misiniz? Orada düzenleme için teşekkürler Gareth, çok daha hoş görünüyor.
Keith

Bu yüzden görev bu biçimlendirme ile tamam çalışır, ancak daha sonra .NET programı (yolu bir arg dizesi olarak kabul eder) yolu 8.3 biçiminden sıkıştırmaz. Belki de bu bir programlama sorusudur - 8.3 yolları nasıl ele alınır?
Rodney

Bunu bize yaşlı biliyorum, ama kısa çizgi (-) denediniz mi?
Chibueze Opata

1

Windows XP'de kullandığım VLC ile benzer bir sorun yaşadım. Hile etmektir bağımsız değişkeni içine bir cmdçift tırnak komuta.

İşte kullandığım bir örnek (15: 00'da bir kayıt zamanlama):

15:00 cmd / c "" C: \ Programmi \ VideoLAN \ VLC \ vlc.exe dvb-t: // frekans = 698000000: program = 4006: çalışma zamanı = 5 - çıkış "C: \ Belgeler ve Ayarlar \ KullanıcıAdı \ Documents \ video \ VLC \ test.mpg """

Komuttan hemen sonra /cve sonunda (sonra .mpg) çift ​​tırnak işareti kullanıldığına dikkat edin . Bu durumda boşlukları olan argüman"C:\Documents and Settings\..."


1

Bunu yapmanın bir yolu, komut satırından powershell kullanmaktır.

Bu kodu MyModule.psm1 adlı bir dosyaya ekleyin.

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

Sonra komut satırından VEYA bir ps1 dosyasından çalıştırabilirsiniz:

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)

Taskparameters dizisindeki ilgili her öğe $ (Arg0), $ (Arg1) ve $ (Arg2) olarak iletilir.


0

Zamanlanan görevinizi aşağıdaki gibi ayarlayın

cmd / c C: \ Program Files \ xyz \ FTP Dosya Aktarımı \ FTPFileTransferTask.exe "C: \ Program Files \ xyz \ Arabirim \ Klasör Yolu"


0

Sorunu farklı bir perspektiften anlamaya yardımcı olabilir .. Diyelim ki Windows'a bir görev zamanlayıcısı eklemekle suçlanan programcı sizsiniz. Nasıl yapardın? Şunlara karşı çıkmanız gereken birkaç sorun var: Görev, oturum açmış kullanıcı dışında biri olarak çalıştırılırsa, oturum açmış kullanıcıyı herhangi bir hata açılır penceresi ile rahatsız etmeli misiniz? Görev yürütülürken oturum açmış bir kullanıcı yoksa ne olur? Bir GUI programı ile bir konsol programı arasındaki fark nedir? GUI'lerde stdin, stdout ve stderr yoktur; kavram onlar için anlamsızdır. COMMAND.COM/CMD.EXE içindeki veya dışındaki programlar ne olacak? Veya diğer kodlama motorları? Komut adında boşluk bulunan yollar ne olacak? Veya parametrelerde (seçenekler / argümanlar)? (Şimdi uğraşmaya çalışırken ..)

Bu durumda dahili veya tam teknik ayrıntılar hakkında% 100 emin olmasam da, cevaplar gibi görünüyor. Görevler, şu anda oturum açmış olan kullanıcıyla (varsa) etkileşime giremeyen yalıtılmış, etkileşimli olmayan bir oturumda çalıştırılır. ); Konsol çıkışı olmaması bekleniyor, çünkü etkileşimli olmadığı için, herhangi bir şekilde giriş yapan kullanıcıyı çıktıyı göstermek için kesemez, her nasılsa (ve çıktı varsa, stdin bitbucket / NULL, stdout ve stderr giriş yapar sistem kayıt tesisi); Boşluklar, sorun atlanarak işlenir: komut adı tam olarak alınır ve komuta iletilen parametreler, Görev özelliklerindeki başka bir giriş kutusunda belirtilir.

Tüm anlamı, görevin bir cini gibi sanki (Un * x dünyasında) yürütülmelidir. Her şey statik ve kesindir. Komut adı, parametresiz gerçek komut adıdır. Bu genellikle CMD.EXE gibi çalışan komut / komut yorumlayıcılarını içerir! Varsa parametreler başka bir yerde belirtilir ve görevi ayarlarken bilinmelidir (yani, "anında" değiştiremezsiniz). Ve bunun gibi.

Bu nedenle, parametreleri dahil etmek istiyorsanız, parametreleri belirtmek için parametreler bölümünü kullanmanız gerekir. Görev Zamanlayıcı yapar değilkomut satırı programlarının yaptığı gibi "komut" ve "args" olarak bölmek için komut adını ayrıştırmaya çalışın. Sadece büyük, tam bir komut adı gibi davranır. Benzer şekilde, BATCH dosyalarında% 1 ..% n kullanmak gibi değişken parametreler istiyorsanız, bunu Görev Zamanlayıcı'nın kendisinden yapamazsınız; Başka bir yol bulmalısın. (Programa iletilen ortam, görevin başlatıldığı ortama bağlı olduğundan, ortam değişkenlerini kullanamayacağınızı unutmayın. "Geçerli" ortam DEĞİL.) Parametreleri kaydetmek için geçici bir dosya kullanabilirsiniz, ancak Görev özelliklerinde statik bir dosya adı belirtmelidir; 5000 kullanıcılı bir ağda olduğunuzda ve dördü aynı görevi aynı anda çalıştırmayı denediğinde ne olur? Hepsi aynı anda aynı geçici dosyaya yazmaya çalışırken birbirlerini tıkayacak, muhtemelen istediğin de değil. (Bu soruna da çözümler var, ama bu soru ve cevap kapsamının çok dışına çıkıyor.)

Yani son cevap: Basit durumda - parametre olarak geçmek istediğiniz yol statiktir ve değişmez - parametreleri Program / Komut Dosyası kutusu yerine uygun Görev özelliğinde (Bağımsız Değişkenler) belirtmeniz gerekir veya bir toplu iş dosyası kullanın. Daha karmaşık bir durumda - cinlerin nasıl çalıştığını ve kilitleme / semaforların nasıl kullanılacağını ve süreçler arası iletişim (IPC) için doğru soruyu veya araştırmayı sormanız gerekir.

İyi şanslar.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.