スペースを含むWindowsスケジュールタスクに引数を渡す方法


15

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

コマンドプロンプトで実行すると、引数を ""で囲むだけで問題なく動作しますが、スケジュールされたタスクUIでは動作しません。

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

引数を "" '' []()でラップして、%20、〜1などでスペースを埋めようとしましたが、うまくいきませんでした。

batファイルを作成し、引数の周りに ""を使用する1つのソリューションを知っていますが、これ以上複雑にしたくありません。

Windows 7とWindows 2008 Serverで試しましたが、両方とも失敗しました。これに関する議論はないようですか?


1
スケジュールされたタスクを編集するときに、プログラム/スクリプトセクションまたは引数追加(オプション)セクションに引数を入れていますか?
ウィリアムジャクソン

引数の正しいラッピングは、スケジュールされたTaksではなくプログラムの裁量にあるため、使用しているプログラムを正確に指定すると役立ちます。たとえば、WinSCPでは、引用符をネストする必要がある場合、二重引用符( "" ... "")が必要です。
トビアスプルタット

1)何が失敗しているか、タスクまたは.exe、2)正確に何を入力し、TaskSched UIのどこにあるのかについては、かなり不明確です。TaskSchedがコマンド(実行可能ファイルへのフルパス)を要求する場所に、コマンドライン(非常に異なるもの)を与えようとしている可能性がありますか?
kreemoweet

なぜバッチファイルに対してですか?物事がとても簡単になります!または、冒険心を感じている場合は、PowerShellスクリプトを撮影できます。
tumchaaditya13年

回答:


6

スケジュールされたタスクを処理しましたが、通常は引数を独自のテキスト入力ボックスに入れます。これは、プログラム/スクリプトフィールドを指すアクションがexeを指すことを意味し、「引数の追加」フィールドにはすべてのパラメーターが必要です。(ソース

ブログ画像

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

私は常にPowerShellスクリプトを使用してこれを行います。以下に例を示します。

  • プログラム/スクリプト: powershell.exe
  • 引数を追加します:-command "& 'C:\ HSD-Copy \ logoffstudents.ps1'" -NonInteractive
  • 開始:空白

感謝しますが、問題は、私のパラメーターの1つがファイルパスである(そしてその中にスペースがある)ことです。あなたの例では100が動作しますが、「C:\ Start Folder」を渡したい場合はどうでしょうか?
ロドニー

私は自分のプログラムで引用符を使用するだけで機能します。アンパサンドは、powershellでのみ必要です。この記号はCALL演算子であり、powershellコマンドを表示できます。ほとんどの場合、引用符で十分です。この時点で、exeの作成者に連絡して、スケジュールされたタスクをサポートしているかどうかを調べることをお勧めします。スケジュールされたタスクとして実行することを拒否するまれなプログラムに遭遇しました。問題を引き起こす可能性のあるパラメーターの受け渡し方法には微妙な違いがあると思います。申し訳ありませんが私はこれ以上助けることができません。
ドルトナックル

最悪の場合、フォルダを再構築してスペースを削除できます。それはあなたが望むものではありませんが、それを機能させるための唯一の方法かもしれません。
ドルトナックル

Doltknuckleに感謝します-.batファイルでも実行できることを知っています(そして、Powershellスクリプトで実行するように、パラメーターの周りに ""を使用します。WindowsタスクエディターUIのバグであると確信しています... .exeファイルの作成者を午前;) -それは...テストハーネスを通って、コマンドプロンプトからではなく、WindowsのUIを通じて罰金に動作します
ロドニー

1
exeを作成した場合、これはstackoverflowの質問かもしれません。このexeをスケジュールされたタスクで使用する場合、パラメーターの処理を変更する必要があるかもしれないと感じています。提案の1つは、exeが受け取ったパラメーターをファイルに記録して、何が渡されているかを確認することです。少なくとも、スケジュールされたタスクパラメータがコマンドラインパラメータと同じかどうかを確認できます。
ドルトナックル

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

Program Filesディレクトリ用。

次に、ディレクトリをProgram Filesに変更し、cd "Program Filesその後にcd xyzを続けてdir /x再度発行して、「The Interface」などの8.3形式の名前を見つけます。

あなたが与えた例の最終パスは次のようになります。

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

ありがとう、私は答えに感謝します、しかし、これはさらなる問題を引き起こします。基本的に、このparamフォルダーパスを使用するEXE .NETアプリを呼び出しています-8.3形式が気に入らず、パスが見つかりません。だから、それを行う他の方法はありますか?
ロドニー

ps-これはWindowsスケジュールタスクアプリのバグですか?スペースは非常に一般的です!
ロドニー

Windows 7での簡単なテストがうまくいきます。さまざまな方法がありますが、タスクを設定するために行った手順を説明していただけますか。Garethの編集に感謝します。
キース

したがって、タスクはこのフォーマットで正常に実行されますが、私の.NETプログラム(引数文字列としてパスを受け入れる)は8.3形式からパスを解凍しません。おそらくそれはプログラミングの質問です-8.3パスをどのように扱うか?
ロドニー

これは古いことは知っていますが、ハイフン(-)を試してみましたか?
チブエゼオパ

1

Windows XPで使用していたVLCでも同様の問題がありました。コツは、コマンドの引数cmd二重引用符で囲むことです。

ここに私が使用したものの例があります(15:00に録画をスケジュールします):

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

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


1

これを実現する1つの方法は、コマンドラインから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)

taskparameters配列内のそれぞれの項目は、$(Arg0)、$(Arg1)、および$(Arg2)として渡されます。


0

スケジュールされたタスクを次のように設定します

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


0

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

この場合、内部または完全な技術的詳細について100%確信はありませんが、答えは次のように思われます。タスクは、現在ログインしているユーザー(存在する場合) ); 非対話型であるため、コンソール出力がないことを期待して実行され、ログインしているユーザーを中断して出力を表示することはできません(出力がある場合、stdinはbitbucket / NULL、stdoutおよびstderrに記録されます)システムロギングファシリティ); スペースは問題を回避することで処理されます。コマンド名はそのまま使用され、コマンドに渡されるパラメーターはタスクプロパティの別の入力ボックスで指定されます。

すべての意味は、タスクをデーモンのように(Un * xの世界で)実行する必要があるということです。すべてが静的で正確です。コマンド名は、パラメーターなしの実際のコマンド名です。これには、多くの場合、CMD.EXE!などのコマンド/スクリプトインタープリターの実行が含まれます。パラメーターがある場合は、他の場所で指定され、タスクのセットアップ時に認識される必要があります(つまり、パラメーターを「オンザフライ」で変更することはできません)。等々。

そのため、パラメーターを含める場合は、パラメーターセクションを使用してパラメーターを指定する必要があります。タスクスケジューラはいませんコマンドラインプログラムのように、コマンド名を解析して「コマンド」と「引数」に分割してみてください。1つの大きな完全なコマンド名として処理します。同様に、BATCHファイルで%1 ..%nを使用するなど、変数パラメーターが必要な場合は、タスクスケジューラ自体からはできません。別の方法を見つける必要があります。(プログラムに渡される環境は、「現在の」環境ではなく、タスクが開始される環境に依存するため、環境変数も使用できないことに注意してください。)パラメーターを保存するために一時ファイルを使用できますが、タスクプロパティで静的ファイル名を指定する必要があります。5000人のユーザーがいるネットワーク上で4人が同じタスクを同時に実行しようとするとどうなりますか?彼らはすべて同じ一時ファイルに同時に書き込もうとしてお互いを壊します、おそらくあなたが望んでいたものでもないでしょう。(この問題に対する解決策もありますが、それはこの質問と回答の範囲をはるかに超えています。)

最終的な答え:単純な場合-パラメーターとして渡すパスは静的で変更されません-プログラム/スクリプトボックスではなく、適切なタスクプロパティ(引数)でパラメーターを指定する必要があります、またはバッチファイルを使用します。より複雑なケースでは、適切な質問をするか、デーモンがどのように機能するか、プロセス間通信(IPC)にロック/セマフォなどを使用する方法を調査する必要があります。

幸運を。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.