如何将参数传递给带有空格的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文件,并在参数周围使用“”,但是我不想增加更多的复杂性。

我在Windows 7和Windows 2008 Server上尝试过,但都失败了。似乎没有任何讨论?


1
在编辑计划任务时,是将参数放在“ 程序/脚本”部分还是“ 添加参数(可选)”部分?
威廉·杰克逊

如果您确切指定要使用哪个程序,将很有帮助,因为正确的参数包装取决于程序而不是计划的Tak。例如,WinSCP在您必须嵌套引号时期望双引号(“” ...“”)。
Tobias Plutat 2011年

目前尚不清楚1)失败,任务或您的.exe,以及2)确切输入的内容以及TaskSched UI中的位置。难道是TaskSched要求一个命令(可执行文件的完整路径)的地方,而您却想给它一个命令行(完全不同的东西)?
kreemoweet 2011年

为什么要针对批处理文件?它使事情变得如此简单!如果您喜欢冒险,也可以拍摄
Powershell

Answers:


6

我已经处理了预定任务,通常将参数放在其自己的文本输入框中。这意味着您将动作指向程序/脚本字段,并指向exe,并且“添加参数”字段应具有所有参数。(来源

博客图片

我相信添加此行为是为了防止exe文件路径中的空格引起问题。

我一直使用PowerShell脚本来执行此操作。这是一个例子:

  • 程序/脚本: powershell.exe
  • 添加参数:-command“&'C:\ HSD-Copy \ logoffstudents.ps1'” -NonInteractive
  • 开始于:空白

谢谢,但是问题是我的参数之一是文件路径(并且其中有空格)。因此,在您的示例中100可以工作,但是如果您想传递“ C:\ Start Folder”怎么办?
罗德尼

我只在程序中使用引号即可。仅在Powershell中才需要与号。这个符号是CALL运算符,它允许我调出powershell命令。在大多数情况下,报价就是您所需要的。在这一点上,您可能希望联系exe的创建者,以查看他们是否支持计划的任务。我遇到了一些罕见的程序,它们拒绝按计划的任务运行。我认为在传递参数方面存在细微的差异,这可能会导致问题。抱歉,我无能为力。
2011年

最糟糕的是,您可以重组文件夹以消除空格。这不是您想要的,但这可能是使其工作的唯一方法。
2011年

谢谢Doltknuckle-我知道我也可以使用.bat文件(并在参数周围使用“”(就像在Powershell脚本中一样。我确定它是Windows Task Editor UI中的错误...(我是.exe的创建者;)-通过测试工具和命令提示符,但未通过Windows UI,它可以正常工作……
Rodney

1
如果您制作了exe,则可能是stackoverflow的问题。我有种感觉,当此exe与计划任务一起使用时,您可能需要修改参数处理。一个建议是让您的exe将接收到的参数记录到文件中,以便您查看正在传递的内容。至少可以让您查看计划的任务参数是否与命令行参数相同。
2011年

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格式传递path参数来解决此问题。

通过打开命令提示符并dir /x在驱动器的根目录中发出命令,可以发现路径的8.3格式。

您应该看到类似于以下内容的条目

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

用于您的Program Files目录。

然后将目录更改为cd "Program Files“”,然后用cd xyz 替换为Program Files 并dir /x再次发出以找到“ The Interface”的8.3格式名称,依此类推。

您给出的示例的最终路径如下所示:

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

谢谢,我感谢您的回答,但是这会导致更多问题。基本上,我正在调用一个我编写的EXE .NET应用程序,该应用程序使用此param文件夹路径进行操作-它不喜欢8.3格式,并且找不到该路径。那么,还有其他方法可以做到吗?
罗德尼

ps-这是Windows Scheduled Task应用程序中的错误吗?空格很常见!
罗德尼

在Windows 7上进行快速测试对我有用。您能否像完成各种方法一样逐步引导我们完成设置任务的步骤。感谢Gareth的编辑,看起来更好。
基思

因此,使用这种格式,任务可以正常运行,但是我的.NET程序(将路径作为arg字符串接受)不会从8.3格式解压缩路径。因此,也许这是一个编程问题-如何处理8.3路径?
罗德尼

我知道这个年龄很大,但是您尝试使用连字符(-)吗?
Chibueze Opata

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

实现此目的的一种方法是从命令行使用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被记录到系统记录工具);空间由绕过问题处理:命令名取EXACTLY为是,并且参数被传递给命令在任务属性另一个输入框中指定。

这意味着您的任务必须像守护程序一样运行(在Un * x世界中)。一切都是静态和精确的。命令名称是实际的命令名称,没有任何参数。这通常包括运行命令/脚本解释器,例如CMD.EXE!参数(如果有)在其他位置指定,并且在设置任务时必须知道(即,您不能“即时”更改参数)。等等。

因此,如果要包括参数,则必须使用“参数”部分来指定参数。该任务计划程序尝试解析命令名,像命令行程序一样将其拆分为“ command”和“ args”。它只是将其视为一个完整的完整命令名。同样,如果要使用可变参数(例如在BATCH文件中使用%1 ..%n),则不能从Task Scheduler本身执行此操作。您将不得不寻找另一种方式。(请注意,也不能使用环境变量,因为传递给程序的环境取决于任务开始的环境,而不是“当前”环境。)您可以使用临时文件来保存参数,但是由于必须在“任务”属性中指定静态文件名,当您在具有5000个用户的网络中,其中四个尝试同时运行同一任务时会发生什么?他们会互相破坏,试图同时写入同一临时文件,可能也不是您想要的。(也有解决此问题的方法,但这超出了此问题和答案的范围。)

因此,最终的答案是:在简单的情况下-您要作为参数传递的路径是静态且不会更改-您必须在适当的Task属性(参数)中而不是在Program / Script框中指定参数,或使用批处理文件。在更复杂的情况下,您将需要提出正确的问题或研究守护程序如何工作以及如何使用锁定/信号量以及诸如此类的进程间通信(IPC)。

祝好运。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.