Cara menyampaikan argumen ke Tugas Terjadwal Windows dengan spasi di dalamnya

15

Saya perlu mengatur Tugas Terjadwal Windows. Ia menerima 1 parameter / argumen yang merupakan jalur dan dapat berisi spasi. Tugas saya yang Dijadwalkan tidak berfungsi - itu "memecah" parameter di ruang pertama.

Jika saya menjalankannya di Command Prompt, saya hanya bisa membungkus argumen di "" dan berfungsi dengan baik, namun, ini tidak berfungsi di UI Tugas Terjadwal.

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

Saya telah mencoba membungkus argumen dengan "" '' [] () dan telah mencoba mengisi spasi dengan% 20, ~ 1 dll tanpa hasil.

Saya tahu satu solusi untuk membuat file kelelawar dan menggunakan "" argumen saya, tetapi saya tidak ingin menambah kerumitan.

Saya mencobanya pada Windows 7 dan Windows 2008 Server dan keduanya gagal. Sepertinya tidak ada diskusi tentang ini?

Rodney
sumber
1
Apakah Anda meletakkan argumen di bagian Program / skrip atau bagian Tambah argumen (opsional) ketika Anda mengedit Tugas Terjadwal?
William Jackson
Akan sangat membantu jika Anda menentukan program mana yang Anda gunakan dengan tepat, karena pembungkus argumen yang benar adalah kebijaksanaan program dan bukan Taks yang Dijadwalkan. WinSCP, misalnya, mengharapkan tanda kutip ganda ("" ... "") ketika Anda harus membuat tanda kutip.
Tobias Plutat
Cukup jelas untuk 1) apa yang gagal, tugas atau .exe Anda, dan 2) persis apa yang Anda masukkan dan di mana di UI TaskSched. Mungkinkah ketika TaskSched meminta perintah (path lengkap ke executable), Anda mencoba memberikannya command-line (hal yang sangat berbeda)?
kreemoweet
Mengapa menentang file batch? Itu membuat semuanya jadi sangat sederhana! Atau Anda dapat menembak untuk skrip PowerShell jika Anda merasa suka bertualang ..
tumchaaditya

Jawaban:

6

Saya telah bekerja dengan tugas yang dijadwalkan dan Anda biasanya meletakkan argumen di kotak input teksnya sendiri. Ini berarti bahwa Anda mengarahkan tindakan ke bidang program / skrip menunjuk ke exe dan bidang "Tambahkan Argumen" harus memiliki semua parameter. ( sumber )

Gambar blog

Saya percaya perilaku ini ditambahkan untuk mencegah spasi di jalur file ke exe yang menyebabkan masalah.

Saya melakukan ini sepanjang waktu dengan skrip PowerShell. Berikut ini sebuah contoh:

  • Program / skrip: powershell.exe
  • Tambahkan argumen : -perintahkan "& 'C: \ HSD - Salin \ logoffstudents.ps1'" -NonInteraktif
  • Mulai di: Kosong
Doltknuckle
sumber
Terima kasih, tetapi masalahnya adalah bahwa salah satu paramaters saya adalah path file (dan memiliki ruang di dalamnya). Jadi dalam contoh Anda 100 akan berfungsi, tetapi bagaimana jika Anda ingin meneruskan "C: \ Start Folder"?
Rodney
Saya hanya menggunakan tanda kutip di program saya dan berhasil. Ampersand hanya diperlukan dengan PowerShell. Simbol ini adalah operator PANGGILAN dan memungkinkan saya untuk menampilkan perintah PowerShell. Dalam kebanyakan kasus, kutipan adalah semua yang Anda butuhkan. Pada titik ini, Anda mungkin ingin melihat menghubungi pencipta exe untuk melihat apakah mereka mendukung tugas yang dijadwalkan. Saya telah mengalami beberapa program langka yang hanya menolak untuk dijalankan sebagai tugas yang dijadwalkan. Saya pikir ada perbedaan halus tentang bagaimana parameter dilewatkan yang dapat menyebabkan masalah. Maaf saya tidak bisa membantu lagi.
Doltknuckle
Paling buruk, Anda dapat menyusun ulang folder untuk menghilangkan spasi. Bukan apa yang Anda inginkan, tetapi itu bisa menjadi satu-satunya cara untuk membuatnya bekerja.
Doltknuckle
Terima kasih Doltknuckle - Saya tahu saya juga bisa melakukannya dengan file .bat (dan menggunakan "" di sekitar param (seperti yang Anda lakukan dalam skrip Powershell. Saya yakin itu adalah bug di UI editor Windows Task ... (saya saya pencipta .exe;) - Ini berfungsi dengan baik melalui uji coba dan dari command prompt tetapi tidak melalui UI Windows ...
Rodney
1
Jika Anda membuat exe, ini mungkin pertanyaan untuk stackoverflow. Saya merasa bahwa Anda mungkin perlu memodifikasi penanganan parameter Anda ketika exe ini digunakan dengan tugas yang dijadwalkan. Salah satu saran adalah meminta exe mencatat parameter yang diterima ke file sehingga Anda dapat melihat apa yang diteruskan. Setidaknya akan memungkinkan Anda untuk melihat apakah parameter tugas yang dijadwalkan sama dengan parameter baris perintah.
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"

Perhatikan penggunaan 'jalur file yang akan dijalankan.

Aman Mehra
sumber
3

Dalam hal ini, Anda bisa mengatasi masalah dengan mengirimkan parameter path Anda dalam format 8.3.

Anda dapat menemukan format 8.3 untuk jalur Anda dengan membuka prompt perintah dan mengeluarkan perintah dir /xdi root drive Anda.

Anda akan melihat entri yang mirip dengan

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

untuk direktori Program Files Anda.

Kemudian ubah direktori ke Program Files dengan cd "Program Files"diikuti oleh cd xyz dan terbitkan dir /xlagi untuk menemukan nama format 8.3 untuk" The Interface ", dan seterusnya.

Jalan terakhir Anda untuk contoh yang Anda berikan akan terlihat seperti:

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1
Keith
sumber
Terima kasih, saya menghargai jawabannya, namun ini menyebabkan masalah lebih lanjut. Pada dasarnya saya memanggil aplikasi .NET EXE yang saya tulis yang menggunakan path folder param ini untuk sesuatu - tidak seperti format 8.3 dan tidak dapat menemukan path. Jadi, apakah ada cara lain untuk melakukannya?
Rodney
ps - Jadi, apakah ini bug di aplikasi Tugas Terjadwal Windows? Spasi sangat umum!
Rodney
Tes cepat pada windows 7 bekerja untuk saya. Bisakah Anda memandu kami melalui langkah-langkah yang Anda ambil untuk mengatur tugas, karena ada berbagai cara. Terima kasih untuk hasil edit di sana Gareth, terlihat jauh lebih bagus.
Keith
Jadi tugas berjalan ok dengan pemformatan ini, tetapi kemudian program .NET saya (yang menerima path sebagai string arg) tidak membuka kompresi path dari format 8.3. Jadi mungkin ini adalah pertanyaan pemrograman - bagaimana menangani 8.3 path?
Rodney
Saya tahu ini sudah lama, tetapi apakah Anda mencoba tanda hubung (-)?
Chibueze Opata
1

Saya memiliki masalah yang sama dengan VLC, yang saya gunakan pada Windows XP. Caranya adalah dengan melampirkan argumen dari cmdperintah dalam tanda kutip ganda.

Berikut adalah contoh dari apa yang saya gunakan (penjadwalan rekaman pukul 15:00):

pada 15:00 cmd / c "" C: \ Programmi \ VideoLAN \ VLC \ vlc.exe dvb-t: // frekuensi = 698000000: program = 4006: run-time = 5 --sout "C: \ Documents and Settings \ UserName \ Documents \ Video \ VLC \ test.mpg "" "

Perhatikan penggunaan tanda kutip ganda tepat setelah /cdan di akhir perintah (setelah .mpg). Argumen dengan spasi dalam hal ini adalah"C:\Documents and Settings\..."

tomatoma
sumber
1

Salah satu cara Anda dapat mencapai ini adalah menggunakan PowerShell dari baris perintah.

Tambahkan kode ini ke file bernama 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-*"

Kemudian dari baris perintah ATAU file ps1 Anda dapat menjalankan:

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)

Setiap item dalam array taskparameters akan diteruskan sebagai $ (Arg0), $ (Arg1), dan $ (Arg2).

SpaceGhost440
sumber
0

Tetapkan tugas terjadwal Anda sebagai berikut

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

penyamaran
sumber
0

Mungkin membantu untuk memahami masalah dari sudut pandang yang berbeda .. Katakanlah Anda adalah programmer yang ditugasi menambah penjadwal tugas ke Windows. Bagaimana Anda melakukannya? Anda memiliki beberapa masalah yang harus dihadapi: Jika tugas dijalankan sebagai orang lain selain pengguna yang masuk, haruskah Anda mengganggu pengguna yang masuk dengan sembulan kesalahan? Bagaimana jika tidak ada pengguna yang login pada saat tugas dijalankan? Bagaimana dengan perbedaan antara program GUI dan program konsol? GUI tidak memiliki stdin, stdout, dan stderr; konsep itu tidak ada artinya di dalamnya. Bagaimana dengan program internal atau eksternal ke COMMAND.COM/CMD.EXE? Atau mesin scripting lainnya? Bagaimana dengan path dengan spasi pada nama perintah? Atau dalam parameter (opsi / argumen)? (Saat Anda mencoba untuk berurusan dengan sekarang ..)

Meskipun saya tidak 100% yakin tentang internal atau detail teknis lengkap dalam kasus ini, jawabannya sepertinya .. Tugas dijalankan dalam sesi non-interaktif yang terisolasi, yang tidak dapat berinteraksi dengan pengguna yang saat ini masuk (jika ada ); Itu dijalankan mengharapkan tidak ada output konsol, karena ini non-interaktif, itu tidak bisa hanya mengganggu pengguna yang login untuk menunjukkan output, bagaimanapun (dan jika ada output, stdin adalah bitbucket / NULL, stdout dan stderr bisa masuk ke fasilitas logging sistem); Spasi ditangani dengan melewati masalah: nama perintah diambil PERSIS sebagaimana adanya, dan parameter diteruskan ke perintah ditentukan dalam kotak input lain di properti Tugas.

Apa artinya semua itu adalah bahwa tugas Anda harus dijalankan seolah-olah itu seperti daemon (di dunia Un * x). Semuanya statis dan presisi. Nama perintah adalah nama perintah yang sebenarnya, tanpa parameter apa pun. Ini sering termasuk menjalankan penerjemah perintah / skrip, seperti CMD.EXE! Parameter, jika ada, ditentukan di tempat lain, dan harus diketahui ketika Anda mengatur tugas (yaitu, Anda tidak dapat mengubah parameter "on-the-fly"). Dan seterusnya.

Jadi, jika Anda ingin memasukkan parameter, Anda harus menggunakan bagian parameter untuk menentukan parameter. Penjadwal Tugas tidakcoba parsing nama perintah untuk membaginya menjadi "perintah" dan "args" seperti program baris perintah lakukan. Itu hanya memperlakukannya sebagai satu, nama perintah penuh besar. Demikian juga, jika Anda menginginkan parameter variabel, seperti menggunakan% 1 ..% n dalam file BATCH, Anda tidak dapat melakukannya dari Penjadwal Tugas itu sendiri; Anda harus menemukan cara lain. (Perhatikan bahwa Anda tidak dapat menggunakan variabel lingkungan, karena lingkungan yang diteruskan ke program tergantung pada lingkungan tugas dimulai, BUKAN lingkungan "saat ini".) Anda bisa menggunakan file sementara untuk menyimpan parameter, tetapi karena Anda harus menentukan nama file statis di properti Tugas, apa yang terjadi ketika Anda berada di jaringan dengan 5.000 pengguna dan empat di antaranya mencoba menjalankan tugas yang sama pada waktu yang sama? Mereka semua akan saling menjatuhkan mencoba untuk menulis ke file temp yang sama pada saat yang sama, mungkin juga bukan yang Anda inginkan. (Ada solusi untuk masalah ini juga, tapi itu terlalu jauh di luar cakupan pertanyaan dan jawaban ini ..)

Jadi jawaban terakhir: Dalam kasus sederhana - jalur yang ingin Anda lewati sebagai parameter statis dan tidak berubah - Anda juga harus menentukan parameter di properti Tugas yang sesuai (Argumen) daripada di kotak Program / Script , atau gunakan file batch. Dalam kasus yang lebih kompleks - Anda harus mengajukan pertanyaan yang tepat atau meneliti bagaimana daemon bekerja dan bagaimana menggunakan penguncian / semafor dan semacamnya untuk komunikasi antar proses (IPC).

Semoga berhasil.

CM
sumber