我需要设置 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
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"
'
请注意在要运行的文件路径中的使用。
答案2
我曾经使用过计划任务,你通常会将参数放在其自己的文本输入框中。这意味着你将操作指向指向 exe 的程序/脚本字段,并且“添加参数”字段应该包含所有参数。(来源)
我相信添加此行为是为了防止 exe 文件路径中的空格导致问题。
我经常使用 PowerShell 脚本来执行此操作。以下是示例:
- 程序/脚本:执行程序
- 添加参数:-命令“&'C:\HSD - Copy\logoffstudents.ps1'”-非交互式
- 开始于:空白的
答案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
答案4
实现此目的的一种方法是从命令行使用 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) 传入。