Cách truyền đối số cho Tác vụ theo lịch trình của Windows có khoảng trắng trong đó


15

Tôi cần thiết lập một tác vụ theo lịch trình của Windows. Nó chấp nhận 1 tham số / đối số là một đường dẫn và có thể chứa khoảng trắng. Tác vụ theo lịch trình của tôi không hoạt động - nó "phá vỡ" tham số ở không gian đầu tiên.

Nếu tôi chạy nó trong Dấu nhắc lệnh, tôi chỉ có thể bao bọc đối số trong "" và nó hoạt động tốt, tuy nhiên, điều này không hoạt động trong Giao diện người dùng tác vụ theo lịch trình.

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

Tôi đã thử gói đối số bằng "" '' [] () và đã thử điền vào chỗ trống bằng% 20, ~ 1, v.v. không có may mắn.

Tôi biết một giải pháp để tạo tệp dơi và sử dụng "" xung quanh đối số của mình nhưng tôi không muốn thêm phức tạp.

Tôi đã thử nó trên Windows 7 và Windows 2008 Server và cả hai đều thất bại. Dường như không có cuộc thảo luận về điều này?


1
Bạn đang đặt đối số trong phần Chương trình / tập lệnh hay phần Thêm đối số (tùy chọn) khi bạn chỉnh sửa Tác vụ theo lịch?
William Jackson

Sẽ rất hữu ích nếu bạn chỉ định chính xác chương trình nào bạn đang sử dụng, vì việc gói chính xác các đối số là theo quyết định của chương trình và không theo lịch trình Taks. WinSCP, ví dụ, mong đợi dấu ngoặc kép ("" ... "") khi bạn phải lồng dấu ngoặc kép.
Tobias Plutat

Điều này khá không rõ ràng với 1) điều gì đang thất bại, nhiệm vụ hoặc .exe của bạn và 2) chính xác những gì bạn đã nhập và ở đâu trong Giao diện người dùng Nhiệm vụ. Có thể đó là nơi mà TaskSched yêu cầu một lệnh (đường dẫn đầy đủ để thực thi), bạn đang cố gắng cung cấp cho nó một dòng lệnh (điều rất khác)?
kreemoweet

Tại sao chống lại tập tin hàng loạt? Nó làm cho mọi thứ thật đơn giản! Hoặc bạn có thể quay cho kịch bản powershell nếu bạn cảm thấy phiêu lưu ..
tumchaaditya

Câu trả lời:


6

Tôi đã làm việc với các tác vụ theo lịch trình và bạn thường đặt các đối số vào hộp nhập văn bản của chính nó. Điều này có nghĩa là bạn trỏ hành động đến trường chương trình / tập lệnh trỏ đến exe và trường "Thêm đối số" sẽ có tất cả các tham số. ( nguồn )

Hình ảnh blog

Tôi tin rằng hành vi này đã được thêm vào để ngăn không gian trong đường dẫn tệp đến exe gây ra sự cố.

Tôi làm điều này mọi lúc với các tập lệnh PowerShell. Đây là một ví dụ:

  • Chương trình / tập lệnh: powershell.exe
  • Thêm đối số : -command "& 'C: \ HSD - Sao chép \ logoffstudents.ps1'" -NonInteractive
  • Bắt đầu bằng: Trống

Cảm ơn, nhưng vấn đề là một trong những thông số của tôi là đường dẫn tệp (và có một khoảng trắng trong đó). Vì vậy, trong ví dụ 100 của bạn sẽ hoạt động, nhưng nếu bạn muốn vượt qua "C: \ Thư mục bắt đầu" thì sao?
Rodney

Tôi chỉ sử dụng dấu ngoặc kép trong các chương trình của tôi và nó hoạt động. Dấu và chỉ được yêu cầu với powershell. Biểu tượng này là toán tử CALL và cho phép tôi đưa ra lệnh powershell. Trong hầu hết các trường hợp, báo giá là tất cả bạn cần. Tại thời điểm này, bạn có thể muốn xem xét liên hệ với người tạo exe để xem họ có hỗ trợ các tác vụ theo lịch trình hay không. Tôi đã chạy vào một vài chương trình hiếm hoi chỉ từ chối chạy như một nhiệm vụ theo lịch trình. Tôi nghĩ rằng có những khác biệt tinh tế về cách các tham số được thông qua có thể gây ra vấn đề. Xin lỗi tôi không thể giúp nhiều hơn.
Doltknuckle

Tệ nhất, bạn có thể cấu trúc lại thư mục để loại bỏ khoảng trắng. Đó không phải là những gì bạn muốn, nhưng nó có thể là cách duy nhất để làm cho nó hoạt động.
Doltknuckle

Cảm ơn Doltknuckle - Tôi biết tôi cũng có thể làm điều đó với tệp .bat (và sử dụng "" xung quanh param (giống như bạn làm trong tập lệnh Powershell. Tôi chắc chắn đó là một lỗi trong giao diện người dùng Windows Task Editor ... (Tôi là người tạo ra .exe;) - Nó hoạt động tốt thông qua khai thác thử nghiệm và từ dấu nhắc lệnh nhưng không thông qua giao diện người dùng Windows ...
Rodney

1
Nếu bạn đã thực hiện exe, đây có thể là một câu hỏi cho stackoverflow. Tôi có cảm giác rằng bạn có thể cần phải sửa đổi xử lý tham số của mình khi exe này được sử dụng với tác vụ theo lịch trình. Một gợi ý là để exe của bạn ghi lại các tham số nhận được vào một tệp để bạn có thể thấy những gì đang được thông qua. Nó ít nhất sẽ cho phép bạn xem các tham số tác vụ theo lịch trình có giống với các tham số dòng lệnh hay không.
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"

Lưu ý việc sử dụng 'trong đường dẫn của tệp sẽ được chạy.


3

Trong trường hợp này, bạn có thể giải quyết vấn đề bằng cách chuyển tham số đường dẫn của mình ở định dạng 8.3.

Bạn có thể khám phá định dạng 8.3 cho đường dẫn của mình bằng cách mở dấu nhắc lệnh và phát lệnh dir /xtrong thư mục gốc của ổ đĩa.

Bạn sẽ thấy một mục tương tự như

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

cho thư mục Tệp chương trình của bạn.

Sau đó thay đổi thư mục thành Tệp chương trình với cd "Program Files"theo sau là cd xyz và phát hành dir /xlại để tìm tên định dạng 8.3 cho" Giao diện ", v.v.

Đường dẫn cuối cùng của bạn cho ví dụ bạn đã đưa ra sẽ trông giống như:

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

Cảm ơn, tôi đánh giá cao câu trả lời, tuy nhiên điều này gây ra nhiều vấn đề hơn. Về cơ bản tôi đang gọi một ứng dụng EXE .NET mà tôi đã viết sử dụng đường dẫn thư mục param này cho một cái gì đó - nó không thích định dạng 8.3 và không thể tìm thấy đường dẫn. Vì vậy, có cách nào khác để làm điều đó?
Rodney

ps - Vậy đây có phải là lỗi trong ứng dụng Windows lên lịch tác vụ không? Không gian rất phổ biến!
Rodney

Một thử nghiệm nhanh trên windows 7 hoạt động với tôi. Bạn có thể hướng dẫn chúng tôi qua các bước bạn đã thực hiện để thiết lập nhiệm vụ không, như có nhiều cách khác nhau. Cảm ơn vì đã chỉnh sửa Gareth, trông đẹp hơn nhiều.
Keith

Vì vậy, tác vụ chạy ổn với định dạng này, nhưng sau đó chương trình .NET của tôi (chấp nhận đường dẫn dưới dạng chuỗi arg) không giải nén đường dẫn từ định dạng 8.3. Vì vậy, có lẽ đó là một câu hỏi lập trình - làm thế nào để xử lý 8.3 đường dẫn?
Rodney

Tôi biết điều này chúng tôi cũ, nhưng bạn đã thử gạch nối (-)?
Chibueze Opata

1

Tôi gặp vấn đề tương tự với VLC, mà tôi đang sử dụng trên Windows XP. Bí quyết là kèm theo đối số của cmdlệnh trong dấu ngoặc kép.

Dưới đây là một ví dụ về những gì tôi đã sử dụng (lên lịch ghi âm lúc 15:00):

lúc 15:00 cmd / c "" C: \ Programmi \ Videolan \ VLC \ vlc.exe dvb-t: // Hz = 698000000: chương trình = 4006: run-time = 5 --out "C: \ Documents and Settings \ Tên người dùng \ Tài liệu \ Video \ VLC \ test.mpg "" "

Lưu ý việc sử dụng dấu ngoặc kép ngay sau /cvà ở cuối lệnh (sau .mpg). Đối số với khoảng trắng trong trường hợp này là"C:\Documents and Settings\..."


1

Một cách bạn có thể thực hiện điều này là sử dụng powershell từ dòng lệnh.

Thêm mã này vào một tệp có tên 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-*"

Sau đó, từ dòng lệnh HOẶC tệp ps1 bạn có thể chạy:

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)

Mỗi mục tương ứng trong mảng đường kính nhiệm vụ sẽ được chuyển qua là $ (Arg0), $ (Arg1) và $ (Arg2).


0

Đặt nhiệm vụ theo lịch trình của bạn như sau

cmd / c C: \ Tệp chương trình \ xyz \ Truyền tệp FTP \ FTPFileTransferTask.exe "C: \ Tệp chương trình \ xyz \ Giao diện \ Đường dẫn thư mục"


0

Có thể giúp hiểu vấn đề từ một khía cạnh khác .. Giả sử bạn là lập trình viên chịu trách nhiệm thêm bộ lập lịch tác vụ vào Windows. Bạn sẽ làm điều này như thế nào? Bạn có một số vấn đề cần giải quyết: Nếu tác vụ được chạy với tư cách là người khác không phải người dùng đã đăng nhập, bạn có nên làm phiền người dùng đã đăng nhập với bất kỳ lỗi bật lên nào không? Điều gì nếu không có người dùng đăng nhập tại thời điểm tác vụ được chạy? Còn sự khác biệt giữa chương trình GUI và chương trình console thì sao? GUI không có stdin, stdout và stderr; khái niệm này là vô nghĩa trong họ. Điều gì về các chương trình nội bộ hoặc bên ngoài đối với HOL.COM / CMD.EXE? Hoặc các công cụ kịch bản khác? Điều gì về các đường dẫn có khoảng trắng trong tên lệnh? Hoặc trong các tham số (tùy chọn / đối số)? (Hiện tại bạn đang cố gắng giải quyết ..)

Mặc dù tôi không chắc chắn 100% về nội bộ hoặc chi tiết kỹ thuật đầy đủ trong trường hợp này, nhưng câu trả lời dường như là .. Các tác vụ được chạy trong một phiên không tương tác, bị cô lập, không thể tương tác với người dùng hiện đang đăng nhập (nếu có ); Nó chạy hy vọng sẽ không có đầu ra giao diện điều khiển, vì nó không tương tác, nó không thể làm gián đoạn bất kỳ người dùng đã đăng nhập nào để hiển thị đầu ra, dù sao đi nữa (và nếu có đầu ra, stdin là bitbucket / NULL, stdout và stderr được đăng nhập vào cơ sở khai thác hệ thống); Không gian được xử lý bằng cách bỏ qua vấn đề: tên lệnh được lấy CHÍNH XÁC và các tham số được truyền cho lệnh được chỉ định trong hộp đầu vào khác trong thuộc tính Tác vụ.

Tất cả các phương tiện là nhiệm vụ của bạn phải được chạy như thể nó giống như một daemon (trong thế giới Un * x). Mọi thứ đều tĩnh và chính xác. Tên lệnh là tên lệnh thực tế, không có bất kỳ tham số nào. Điều này thường bao gồm các trình thông dịch lệnh / script đang chạy, chẳng hạn như CMD.EXE! Các tham số, nếu có, được chỉ định ở nơi khác và phải được biết khi bạn thiết lập tác vụ (nghĩa là bạn không thể thay đổi các tham số "đang hoạt động"). Và như thế.

Vì vậy, nếu bạn muốn bao gồm các tham số, bạn phải sử dụng phần tham số để chỉ định tham số. Trình lập lịch tác vụ thực hiện khôngcố gắng phân tích tên lệnh để tách nó thành "lệnh" và "args" giống như các chương trình dòng lệnh làm. Nó chỉ coi nó như một tên lệnh lớn, đầy đủ. Tương tự, nếu bạn muốn các tham số biến đổi, như sử dụng% 1 ..% n trong các tệp BATCH, bạn không thể làm như vậy từ chính Trình lập lịch tác vụ; Bạn sẽ phải tìm một cách khác. (Lưu ý rằng bạn không thể sử dụng các biến môi trường, vì môi trường được truyền cho chương trình phụ thuộc vào môi trường mà tác vụ được bắt đầu, KHÔNG phải môi trường "hiện tại".) Bạn có thể sử dụng tệp tạm thời để lưu tham số, nhưng vì bạn phải chỉ định tên tệp tĩnh trong thuộc tính Tác vụ, điều gì xảy ra khi bạn ở trên mạng có 5000 người dùng và bốn người trong số họ cố gắng chạy cùng một tác vụ cùng một lúc? Tất cả họ sẽ ghi đè lên nhau khi cố gắng ghi vào cùng một tệp tạm thời, có lẽ không phải là những gì bạn muốn (Cũng có giải pháp cho vấn đề này, nhưng điều đó đi quá xa phạm vi của câu hỏi và câu trả lời này ..)

Vì vậy, câu trả lời cuối cùng: Trong trường hợp đơn giản - đường dẫn bạn muốn chuyển qua làm tham số là tĩnh và không thay đổi - bạn phải chỉ định tham số trong thuộc tính Tác vụ (Đối số) thích hợp thay vì trong hộp Chương trình / Tập lệnh hoặc sử dụng tệp bó. Trong trường hợp phức tạp hơn - bạn sẽ cần hỏi đúng câu hỏi hoặc nghiên cứu cách hoạt động của daemon và cách sử dụng khóa / semaphores và như vậy cho giao tiếp giữa các quá trình (IPC).

Chúc may mắn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.