विंडोज शेड्यूल्ड टास्क में एक तर्क कैसे पास करें, जिसमें रिक्त स्थान हो


15

मुझे विंडोज शेड्यूल्ड टास्क सेट करना होगा। यह 1 पैरामीटर / तर्क को स्वीकार करता है जो एक पथ है और इसमें रिक्त स्थान हो सकते हैं। मेरा शेड्यूल किया गया कार्य काम नहीं करता है - यह पहले स्थान पर पैरामीटर को "तोड़" देता है।

अगर मैं इसे कमांड प्रॉम्प्ट में चलाता हूं तो मैं केवल "" में तर्क को लपेट सकता हूं और यह ठीक काम करता है, हालांकि, यह अनुसूचित टास्क यूआई में काम नहीं करता है।

जैसे C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"

मैंने "" '' [] () के साथ तर्क को लपेटने का प्रयास किया है और बिना किसी भाग्य के% 20, ~ 1 आदि के साथ रिक्त स्थान भरने की कोशिश की है।

मैं अपने तर्क के इर्दगिर्द बल्लेबाजी करने और उपयोग करने के लिए एक समाधान जानता हूं, लेकिन मैं अधिक जटिलता नहीं जोड़ना चाहता।

मैंने इसे विंडोज 7 और विंडोज 2008 सर्वर पर आजमाया और दोनों विफल रहे। लगता है इस पर कोई चर्चा नहीं हुई?


1
जब आप शेड्यूल किए गए कार्य को संपादित करते हैं, तो क्या आप प्रोग्राम / स्क्रिप्ट अनुभाग या तर्क जोड़ें (वैकल्पिक) अनुभाग में तर्क डाल रहे हैं ?
विलियम जैक्सन

यह उपयोगी होगा यदि आप निर्दिष्ट करते हैं कि आप किस कार्यक्रम का उपयोग कर रहे हैं, क्योंकि तर्कों का सही रैपिंग कार्यक्रम के विवेक पर है न कि अनुसूचित टैक के लिए। WinSCP, उदाहरण के लिए, दोहरे उद्धरणों ("" ... "") की अपेक्षा करता है जब आपको घोंसले के उद्धरण देने होते हैं।
टोबियास प्लूटैट

यह 1 के रूप में बहुत स्पष्ट नहीं है) क्या विफल हो रहा है, कार्य या आपका .exe, और 2) बिल्कुल वही जो आपने दर्ज किया है और जहां टास्ककेड UI में है। क्या ऐसा हो सकता है कि जहां टास्कस्च्ड एक कमांड के लिए पूछता है (निष्पादन योग्य पूरा रास्ता), आप इसे कमांड-लाइन (बहुत अलग चीज) देने की कोशिश कर रहे हैं?
kreemoweet

बैच फाइल के खिलाफ क्यों? यह चीजों को इतना सरल बनाता है! या यदि आप साहसी महसूस कर रहे हैं तो आप
पॉवरशेल

जवाबों:


6

मैंने निर्धारित कार्यों के साथ काम किया है और आप आम तौर पर अपने पाठ इनपुट बॉक्स में तर्क डालते हैं। इसका मतलब यह है कि आप एक्शन प्रोग्राम / स्क्रिप्ट फ़ील्ड पॉइंट को एक्सई पर इंगित करते हैं और "आर्ग्यूमेंट्स जोड़ें" फ़ील्ड में सभी पैरामीटर होने चाहिए। ( स्रोत )

ब्लॉग छवि

मेरा मानना ​​है कि इस व्यवहार को समस्या पैदा करने के लिए फ़ाइल पथ में रिक्त स्थान को रोकने के लिए जोड़ा गया था।

मैं यह सब PowerShell स्क्रिप्ट्स के साथ करता हूं। यहाँ एक उदाहरण है:

  • कार्यक्रम / स्क्रिप्ट: शक्तियाँ। Exe
  • तर्क जोड़ें : -कमांड "और 'C: \ HSD - Copy \ logoffstudents.ps1'" -NonInteractive
  • में शुरू: खाली

धन्यवाद, लेकिन समस्या यह है कि मेरा एक पैरामाटर एक फ़ाइल पथ है (और इसमें एक स्थान है)। तो आपके उदाहरण में 100 काम करेंगे, लेकिन क्या होगा यदि आप "C: \ Start Folder" पास करना चाहते हैं?
रॉडने

मैं सिर्फ अपने कार्यक्रमों में उद्धरण का उपयोग करता हूं और यह काम करता है। एम्परसेंड केवल शक्तियां के साथ आवश्यक है। यह प्रतीक CALL ऑपरेटर है और मुझे एक पॉवरशेल कमांड लाने की अनुमति देता है। ज्यादातर मामलों में, उद्धरण आप सभी की जरूरत है। इस बिंदु पर, आप यह देखने के लिए exe के निर्माता से संपर्क करना चाह सकते हैं कि क्या वे निर्धारित कार्यों का समर्थन करते हैं। मैंने कुछ दुर्लभ कार्यक्रमों में भाग लिया है जो सिर्फ एक निर्धारित कार्य के रूप में चलाने से इनकार करते हैं। मुझे लगता है कि मापदंडों के पारित होने पर सूक्ष्म अंतर हैं जो समस्याएं पैदा कर सकते हैं। क्षमा करें, मैं और अधिक मदद नहीं कर सकता।
Doltknuckle

सबसे कम, आप रिक्त स्थान को खत्म करने के लिए फ़ोल्डर का पुनर्गठन कर सकते हैं। यह वह नहीं है जो आप चाहते हैं, लेकिन यह काम करने का एकमात्र तरीका हो सकता है।
Doltknuckle

धन्यवाद Doltknuckle - मुझे पता है कि मैं इसे एक .bat फ़ाइल के साथ भी कर सकता हूं (और "" का उपयोग परम के आसपास कर सकता हूं (जैसे आप पॉवर्सशेल स्क्रिप्ट में करते हैं। मुझे यकीन है कि यह विंडोज टास्क संपादक यूआई में एक बग है ...) (I .exe का निर्माता हूं;) - यह एक परीक्षण दोहन के माध्यम से और कमांड प्रॉम्प्ट से ठीक काम करता है, लेकिन विंडोज यूआई के माध्यम से नहीं ...
रॉडने

1
यदि आपने निर्वासित किया है, तो यह स्टैकओवरफ्लो के लिए एक प्रश्न हो सकता है। मुझे लगता है कि जब यह निर्धारित कार्य के साथ प्रयोग किया जाता है, तो आपको अपने पैरामीटर से निपटने को संशोधित करने की आवश्यकता हो सकती है। एक सुझाव यह है कि आपके exe को एक फ़ाइल में प्राप्त मापदंडों को लॉग इन करना है ताकि आप देख सकें कि क्या पारित किया जा रहा है। यह कम से कम आपको यह देखने की अनुमति देगा कि क्या अनुसूचित कार्य पैरामीटर कमांड लाइन मापदंडों के समान हैं।
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"

'चलाने के लिए फ़ाइल के पथ में उपयोग पर ध्यान दें ।


3

इस स्थिति में, आप 8.3 प्रारूप में अपना पथ पैरामीटर पास करके समस्या के आसपास काम कर सकते हैं।

आप कमांड प्रॉम्प्ट खोलकर और dir /xअपने ड्राइव के रूट में कमांड जारी करके अपने मार्ग के लिए 8.3 प्रारूप की खोज कर सकते हैं ।

आपको एक प्रविष्टि देखनी चाहिए

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

अपने प्रोग्राम फ़ाइलों निर्देशिका के लिए।

फिर निर्देशिका फाइलों को प्रोग्राम फाइल में बदल दें, cd "Program Filesजिसके बाद सीडी xyz है और dir /xफिर से "द इंटरफेस" के लिए 8.3 प्रारूप नाम खोजने के लिए जारी करें, और इसी तरह।

आपके द्वारा दिए गए उदाहरण के लिए आपका अंतिम मार्ग कुछ इस तरह दिखाई देगा:

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

धन्यवाद, मैं उत्तर की सराहना करता हूं, हालांकि यह आगे की समस्याओं का कारण बनता है। मूल रूप से मैं एक EXE .NET ऐप कह रहा हूं, जो मैंने लिखा था जो कुछ के लिए इस परम फ़ोल्डर पथ का उपयोग करता है - यह 8.3 प्रारूप को पसंद नहीं करता है और पथ नहीं पा सकता है। तो, क्या ऐसा करने का कोई और तरीका है?
रोडनी

ps - तो क्या यह विंडोज शेड्यूल्ड टास्क ऐप में बग है? रिक्तियाँ बहुत आम हैं!
रोडनी

विंडोज 7 पर एक त्वरित परीक्षण मेरे लिए काम करता है। क्या आप विभिन्न तरीकों के रूप में कार्य को निर्धारित करने के लिए उठाए गए कदमों के माध्यम से हमें चला सकते हैं। वहाँ संपादित करने के लिए धन्यवाद गैरेथ, बहुत अच्छा लग रहा है।
कीथ

इसलिए यह फ़ॉर्मेटिंग के साथ कार्य ठीक चलता है, लेकिन फिर मेरा .NET प्रोग्राम (जो एक arg string के रूप में पथ को स्वीकार करता है) 8.3 फॉर्मेट से पथ को अनकम्प्रेस्ड नहीं करता है। तो शायद यह एक प्रोग्रामिंग सवाल है - 8.3 रास्तों को कैसे संभालना है?
रोडनी

मुझे यह पुराना मालूम है, लेकिन क्या आपने हाइफ़न (-) आज़माया है?
चिब्यूज ओपटा

1

मुझे वीएलसी के साथ एक समान समस्या थी, जिसका मैं विंडोज एक्सपी पर उपयोग कर रहा था। चाल को दोहरे उद्धरण चिह्नों में कमांड के तर्क को शामिल करना है cmd

यहाँ एक उदाहरण है कि मैंने क्या इस्तेमाल किया (15:00 बजे रिकॉर्डिंग दर्ज करना):

15:00 cmd / c "" C: \ Programmi \ VideoLAN \ VLC \ vlc.exe DVb-t: // आवृत्ति = 698000000: प्रोग्राम = 4006: रन-टाइम = 5 --आउट "C: \ Documents and Settings \ उपयोगकर्ता नाम \ दस्तावेज़ \ वीडियो \ वीएलसी \ test.mpg "" "

/cआदेश के अंत में और बाद में (के बाद .mpg) दोहरे उद्धरण चिह्नों के उपयोग पर ध्यान दें । इस मामले में रिक्त स्थान के साथ तर्क है"C:\Documents and Settings\..."


1

एक तरीका जिसे आप पूरा कर सकते हैं वह कमांड लाइन से पावरशेल का उपयोग कर रहा है।

इस कोड को 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-*"

फिर कमांड लाइन या एक ps1 फाइल से जिसे आप चला सकते हैं:

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)

टास्कपामेटर्स सरणी में प्रत्येक संबंधित आइटम $ (Arg0), $ (Arg1), और $ (Arg2) के रूप में पास हो जाएगा।


0

अपना निर्धारित कार्य निम्नानुसार निर्धारित करें

cmd / c C: \ Program Files \ xyz \ FTP फाइल ट्रांसफर \ FTPFileTransferTask.exe "C: \ Program Files \ xyz \ The Interface \ Folder Path"


0

यह एक अलग दृष्टिकोण से समस्या को समझने में मदद कर सकता है .. मान लीजिए कि आप प्रोग्रामर हैं, जिन पर विंडोज में एक कार्य अनुसूचक जोड़ने का आरोप लगाया गया है। आपको इसे कैसे करना होगा? आपको कई समस्याओं का सामना करना पड़ता है: यदि कार्य उपयोगकर्ता के लॉग इन के अलावा किसी और के रूप में चलाया जाता है, तो क्या आपको किसी भी त्रुटि पॉपअप के साथ उपयोगकर्ता में लॉग इन को परेशान करना चाहिए? यदि कार्य चलने के समय उपयोगकर्ता में कोई लॉग इन नहीं है तो क्या होगा? GUI प्रोग्राम और कंसोल प्रोग्राम के बीच अंतर के बारे में क्या? जीयूआई में स्टड, स्टडआउट और स्टेडर नहीं है; उनमें अवधारणा निरर्थक है। COMMAND.COM/CMD.EXE में आंतरिक या बाहरी कार्यक्रमों के बारे में क्या? या अन्य स्क्रिप्टिंग इंजन? कमांड नाम के रिक्त स्थान वाले रास्तों के बारे में क्या? या मापदंडों (विकल्प / तर्क) में? (जैसा कि आप अभी निपटने की कोशिश कर रहे हैं ..)

हालांकि मैं इस मामले में इंटर्न या पूर्ण तकनीकी विवरण के बारे में 100% निश्चित नहीं हूं, लेकिन उत्तर प्रतीत होते हैं .. कार्य एक पृथक, गैर-संवादात्मक सत्र में चलाए जाते हैं, जो वर्तमान में लॉग इन उपयोगकर्ता के साथ बातचीत नहीं कर सकता है (यदि कोई हो ); यह चलाने की उम्मीद है कि कोई कंसोल आउटपुट नहीं है, क्योंकि यह गैर-संवादात्मक है, यह आउटपुट को दिखाने के लिए किसी भी लॉग इन उपयोगकर्ता को बाधित नहीं कर सकता, किसी भी तरह (और यदि आउटपुट है, तो स्टड बिटबकेट / NULL है, स्टडआउट और strr लॉग इन हो सकता है) सिस्टम लॉगिंग सुविधा); इस मुद्दे को दरकिनार करके रिक्त स्थान को नियंत्रित किया जाता है: कमांड का नाम बिल्कुल वैसे ही लिया जाता है, और कमांड को पास किया जाता है टास्क संपत्तियों में एक और इनपुट बॉक्स में निर्दिष्ट किया जाता है।

सभी साधनों का मतलब यह है कि आपके कार्य को ऐसे चलाया जाना चाहिए जैसे कि यह एक डेमॉन की तरह था (अन * x दुनिया में)। सब कुछ स्थिर और सटीक है। कमांड नाम वास्तविक कमांड नाम है, बिना किसी पैरामीटर के। इसमें अक्सर CMD.EXE जैसे रनिंग कमांड / स्क्रिप्ट दुभाषिए शामिल होते हैं! पैरामीटर, यदि कोई हो, कहीं और निर्दिष्ट किए जाते हैं, और यह ज्ञात होना चाहिए कि जब आप कार्य सेट करते हैं (अर्थात, आप मापदंडों को "ऑन-द-फ्लाई" नहीं बदल सकते हैं)। और इसी तरह।

इसलिए, यदि आप मापदंडों को शामिल करना चाहते हैं, तो आपको मापदंडों को निर्दिष्ट करने के लिए पैरामीटर अनुभाग का उपयोग करना होगा। टास्क शेड्यूलर नहीं करता हैकमांड नाम को पार्स करने के लिए इसे "कमांड" और "आर्ग्स" में विभाजित करने की कोशिश करें जैसे कमांड लाइन प्रोग्राम करते हैं। यह सिर्फ इसे एक बड़ा, पूर्ण कमांड नाम मानता है। इसी तरह, यदि आप परिवर्तनीय पैरामीटर चाहते हैं, जैसे BATCH फ़ाइलों में% 1 ..% n का उपयोग करना, तो आप टास्क शेड्यूल से ऐसा नहीं कर सकते हैं; आपको दूसरा रास्ता खोजना होगा। (ध्यान दें कि आप पर्यावरण चर का उपयोग नहीं कर सकते हैं, या तो, क्योंकि कार्यक्रम के लिए पारित पर्यावरण उस वातावरण पर निर्भर करता है जो कार्य के साथ शुरू किया गया है, "वर्तमान" वातावरण नहीं।) आप मापदंडों को बचाने के लिए एक अस्थायी फ़ाइल का उपयोग कर सकते हैं, लेकिन जब से आप। टास्क गुणों में एक स्थिर फ़ाइल नाम निर्दिष्ट करना चाहिए, जब आप 5000 उपयोगकर्ताओं के साथ नेटवर्क पर होते हैं और उनमें से चार एक ही समय में एक ही कार्य को चलाने की कोशिश करते हैं तो क्या होता है? वे सभी एक दूसरे को एक ही समय में एक ही अस्थायी फ़ाइल में लिखने की कोशिश कर रहे हैं, शायद वह नहीं जो आप चाहते थे। (इस समस्या के समाधान भी हैं, लेकिन यह इस सवाल और जवाब के दायरे से बहुत दूर है ..)

तो अंतिम उत्तर: साधारण मामले में - जिस पथ को आप एक पैरामीटर के रूप में पारित करना चाहते हैं वह स्थिर है और नहीं बदलता है - आपको या तो प्रोग्राम / स्क्रिप्ट बॉक्स के बजाय उपयुक्त टास्क संपत्ति (तर्क) में पैरामीटर निर्दिष्ट करना होगा , या बैच फ़ाइल का उपयोग करें। एक अधिक जटिल मामले में - आपको सही सवाल या शोध करने की आवश्यकता होगी कि डेमॉन कैसे काम करते हैं और लॉकिंग / सेमाफोरेस का उपयोग कैसे करते हैं और इस तरह अंतर-प्रक्रिया संचार (आईपीसी) के लिए।

सौभाग्य।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.