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

Windows スケジューリングされたタスクにスペースを含む引数を渡す方法

Advertisement

Windowsのスケジュールされたタスクを設定する必要があります。それはパスであり、スペースを含むことができる1つのパラメータ/引数を受け入れます。私のスケジュールタスクは動作しません - 最初のスペースでパラメータを「分割」します。

コマンドプロンプトで実行した場合、引数を" “で囲めば問題なく動作しますが、スケジューリングされたタスクのUIでは動作しません。

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

引数を” “ ” ‘ ’ で囲んでみ、スペースを%20や~1などで埋めてみましたが、うまくいきませんでした。

バットファイルを作成して引数の周りに" “を使用する方法がありますが、これ以上複雑さを増したくありません。

Windows 7とWindows 2008 Serverで試してみましたが、どちらも失敗しました。これについての議論はないようですが?

Advertisement
Advertisement

回答 (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"

実行するファイルのパスに'を使用していることに注意してください。

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

私はスケジュールされたタスクで働いてきました、あなたは一般的に独自のテキスト入力ボックスに引数を入れます。これは、アクションをプログラム/スクリプトフィールドがexeを指し、"Add Arguments “フィールドがすべてのパラメータを持っている必要があることを意味します。 ソース )

この動作は、exeへのファイルパス内のスペースが問題を引き起こすのを防ぐために追加されたと思います。

0x1&

この動作は、PowerShellスクリプトでは常に行われています。

  • Program/script: powershell.exe
  • Add arguments . -command ”& ‘C:\HSD - Copy\logoffstudents.ps1’ “ -非インタラクティブ
  • スタートイン:ブランク
3
Advertisement
3
3
2011-04-14 06:31:15 +0000
Advertisement

この場合、パスパラメータを 8.3 形式で渡すことで問題を回避することができます。

コマンドプロンプトを開き、ドライブのルートで dir /x コマンドを発行することで、パスの 8.3 フォーマットを確認することができます。

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

のようなエントリが Program Files ディレクトリにあるはずです。

次に “cd "Program Files"でディレクトリをProgram Filesに変更し、次にcd xyzを実行して、再度dir /xを実行して "The Interface "の8.3フォーマット名を探します。

あなたの例の最終的なパスは以下のようになります。

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

Windows XPで使っていたVLCでも同じような問題がありました。コツは、cmdコマンドの引数の[(http://ss64.com/nt/cmd.html)をダブルクォーテーションで囲む]ことです。

ここでは、私が使った例(15:00に録画をスケジューリング)を紹介します。

/cの直後とコマンドの最後(.mpgの後)に二重引用符を使用していることに注意してください。この場合のスペース付きの引数は "C:\Documents and Settings\..." です。

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

これを実現する方法の一つとして、コマンドラインから powershell を使用する方法があります。

このコードを 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
0
0
2014-04-28 13:52:02 +0000

Set your scheduled task as follows

cmd /c C:\Program Files\xyzFTP File Transfer\FTPFileTransferTask.exe “C:IllustratorFolder Path” “C:IllustratorFolder Path” “C:IllustratorFolder Path” “C:IllustratorFolderPath”

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

別の視点から問題を理解するのに役立つかもしれません。あなたがWindowsにタスクスケジューラを追加することを任されたプログラマーだとしましょう。あなたならどうしますか? あなたにはいくつかの問題があります。タスクがログインしているユーザー以外で実行されている場合、ログインしているユーザーにエラーのポップアップを表示して迷惑をかけるべきか? タスクの実行時にログインしているユーザーがいない場合はどうしますか? GUIプログラムとコンソールプログラムの違いは?GUIにはstdin、stdout、stderrがありません。COMMAND.COM/CMD.EXEの内部プログラムや外部プログラムはどうですか?あるいは他のスクリプトエンジンはどうですか?コマンド名にスペースがあるパスはどうでしょうか?あるいはパラメータ(オプション/引数)の中には?(今対処しようとしているように…)

この場合の内部構造や完全な技術的な詳細については100%の確信はありませんが、答えは次のようになっているようです。タスクは分離された非インタラクティブなセッションで実行されており、現在ログインしているユーザ(もしあれば)と対話することはできません; コンソール出力がないことを期待して実行されており、非インタラクティブなので、出力を表示するためにログインしているユーザを中断することはできません(そして、出力がある場合、stdin は bitbucket/NULL であり、stdout と stderr はシステムのロギング機能に記録されます); スペースは問題をバイパスすることで処理されます。コマンド名はそのまま EXACTLY で取得され、コマンドに渡されるパラメータはタスクプロパティの別の入力ボックスで指定されます。

何を意味するかというと、(Un*xの世界では)デーモンのようにタスクを実行しなければならないということです。すべてが静的で正確です。コマンド名は実際のコマンド名であり、パラメータはありません。これには、CMD.EXE!のような、実行中のコマンド/スクリプトインタプリタが含まれることがよくあります。パラメータは、もしあれば、他の場所で指定されており、タスクをセットアップするときに知っていなければなりません(つまり、パラメータを「その場で」変更することはできません)。といった具合です。

なので、パラメータを含めたい場合は、パラメータセクションを使ってパラメータを指定しなければなりません。タスクスケジューラは、コマンドラインプログラムのようにコマンド名を解析して「コマンド」と「引数」に分割しようとはしません。コマンドラインプログラムのように、コマンド名を解析して “command” と “args” に分割しようとはしません。同様に、BATCH ファイルで %1 … %n を使用するなど、変数のパラメータが必要な場合は、タスクスケジューラ自身からはできません。(プログラムに渡される環境は、「現在の」環境ではなく、タスクが開始される環境に依存するため、環境変数も使用できません。) 一時ファイルを使ってパラメータを保存することもできますが、タスクのプロパティで静的ファイル名を指定しなければならないので、5000人のユーザがいるネットワーク上で、4人のユーザが同時に同じタスクを実行しようとするとどうなるでしょうか? 5000人のユーザがいるネットワーク上で、4人のユーザが同時に同じタスクを実行しようとしたらどうなるでしょうか?(この問題に対する解決策もありますが、この質問と回答の範囲外になりすぎています。)

最後の答えです。単純な場合 – パラメータとして渡したいパスが静的で変化しない場合 – プログラム/スクリプトボックスではなく、適切なタスクプロパティ(Arguments)でパラメータを指定するか、バッチファイルを使用する必要があります。もっと複雑なケースでは、正しい質問をするか、デーモンがどのように動作するのか、プロセス間通信(IPC)のためにロック/セマフォなどをどのように使うのかを研究する必要があります。

頑張ってください。

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

マイクロソフトは、この件についての速報を持っています https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

基本的には、バッチファイルの名前の前後に “\” というシーケンスを使用するように言われています。

Advertisement

関連する質問

3
19
10
28
3
Advertisement
Advertisement