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에서 시도했지만 모두 실패했습니다. 이에 대한 토론이없는 것 같습니까?
답변
예약 된 작업으로 작업했으며 일반적으로 인수를 자체 텍스트 입력 상자에 넣습니다. 즉, 프로그램 / 스크립트 필드에 대한 작업이 exe를 가리키고 “인수 추가”필드에 모든 매개 변수가 있어야합니다. ( 소스 )
이 동작은 파일 경로에서 exe 로의 공백을 방지하여 문제를 일으키는 것으로 추가되었습니다.
PowerShell 스크립트를 사용하여이 작업을 항상 수행합니다. 예를 들면 다음과 같습니다.
- 프로그램 / 스크립트 : powershell.exe
- 인수 추가 : -command “& ‘C : \ HSD-Copy \ logoffstudents.ps1′”-NonInteractive
- 시작 : 공백
답변
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"
'
실행할 파일 경로에서 의 사용에 유의하십시오 .
답변
이 경우 경로 매개 변수를 8.3 형식으로 전달하여 문제를 해결할 수 있습니다.
명령 프롬프트를 열고 dir /x
드라이브 루트 에서 명령 을 실행하여 경로의 8.3 형식을 발견 할 수 있습니다 .
다음과 유사한 항목이 표시되어야합니다.
11/04/2011 12:10 <DIR> PROGRA~1 Program Files
Program Files 디렉토리 용.
그런 다음 cd "Program Files
“를 사용하여 cd xyz로 디렉토리를 프로그램 파일로 변경 하고 dir /x
다시 발행 하여”인터페이스 “의 8.3 형식 이름을 찾으십시오.
당신이 주신 예제의 최종 경로는 다음과 같습니다.
C:\PROGRA~1\XYZ\THEINT~1\FOLDER~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
명령 직후 와 끝에 (after .mpg
) 큰 따옴표를 사용하십시오 . 이 경우 공백이있는 인수는"C:\Documents and Settings\..."
답변
이를 수행 할 수있는 한 가지 방법은 명령 행에서 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)로 전달됩니다.
답변
다음과 같이 예약 된 작업을 설정하십시오
cmd / c C : \ Program Files \ xyz \ FTP 파일 전송 \ FTPFileTransferTask.exe “C : \ Program Files \ xyz \ 인터페이스 \ 폴더 경로”
답변
다른 관점에서 문제를 이해하는 데 도움이 될 수 있습니다. 작업 스케줄러를 Windows에 추가해야하는 프로그래머라고 가정 해 봅시다. 어떻게 하시겠습니까? 여러 가지 문제가 있습니다. 로그인 한 사용자가 아닌 다른 사람으로 작업을 실행하는 경우 로그인 한 사용자에게 오류 팝업이 표시되어야합니까? 작업을 실행할 때 로그인 한 사용자가 없으면 어떻게합니까? GUI 프로그램과 콘솔 프로그램의 차이점은 무엇입니까? GUI에는 stdin, stdout 및 stderr이 없습니다. 그 개념은 의미가 없습니다. COMMAND.COM/CMD.EXE의 내부 또는 외부 프로그램은 어떻습니까? 아니면 다른 스크립팅 엔진? 명령 이름에 공백이있는 경로는 어떻습니까? 또는 매개 변수 (옵션 / 인수)에서? (당신이 지금 다루려고 할 때 ..)
이 경우 내부 또는 전체 기술 세부 사항에 대해 100 % 확신 할 수는 없지만 그 대답은 겉으로 드러납니다. 작업은 현재 로그인 한 사용자 (있는 경우)와 상호 작용할 수없는 격리 된 비 대화식 세션에서 실행됩니다 ); 비 대화식이기 때문에 콘솔 출력이 없을 것으로 예상되어 실행됩니다. 로그인 된 사용자를 방해하여 출력을 표시 할 수는 없습니다 (출력이있는 경우 stdin은 bitbucket / NULL, stdout 및 stderr이 시스템 로깅 기능); 공백이 문제를 우회하여 처리됩니다 명령 이름이 촬영 정확히 그대로 및 매개 변수는 작업 속성에서 다른 입력 상자에 지정된 명령에 전달됩니다.
모든 의미는 작업이 마치 마치 데몬처럼 (Un * x 세계에서) 실행되어야한다는 것입니다. 모든 것이 정적이고 정확합니다. 명령 이름은 매개 변수가없는 실제 명령 이름입니다. 여기에는 종종 CMD.EXE와 같은 명령 / 스크립트 인터프리터 실행이 포함됩니다. 매개 변수 (있는 경우)는 다른 곳에 지정되어 있으며 작업을 설정할 때 알아야합니다 (즉, “즉석”매개 변수를 변경할 수 없음). 등등.
따라서 매개 변수를 포함하려면 매개 변수 섹션을 사용하여 매개 변수를 지정해야합니다. 작업 스케줄러는 수행 하지명령 행 프로그램처럼 “명령”과 “args”로 분할하기 위해 명령 이름을 구문 분석하십시오. 단지 하나의 큰 전체 명령 이름으로 취급합니다. 마찬가지로 BATCH 파일에서 % 1 .. % n을 사용하는 것과 같은 변수 매개 변수를 원하는 경우 작업 스케줄러 자체에서 수행 할 수 없습니다. 다른 방법을 찾아야합니다. (프로그램에 전달 된 환경은 “현재”환경이 아니라 작업이 시작된 환경에 따라 다르므로 환경 변수를 사용할 수 없습니다.) 임시 파일을 사용하여 매개 변수를 저장할 수 있지만 작업 속성에 정적 파일 이름을 지정해야합니다. 사용자가 5000 명인 네트워크에 있고 그 중 4 명이 같은 작업을 동시에 실행하려고하면 어떻게됩니까? 그들은 모두 같은 temp 파일에 동시에 쓰려고 시도하면서 서로를 방해합니다. 아마 당신이 원하는 것도 아닐 것입니다. (이 문제에 대한 해결책도 있지만,이 질문과 답변의 범위를 벗어난 것입니다 ..)
최종 답변 : 간단한 경우-매개 변수로 전달하려는 경로는 정적이며 변경되지 않습니다-프로그램 / 스크립트 상자가 아닌 적절한 작업 속성 (인수)에 매개 변수를 지정해야합니다 또는 배치 파일을 사용하십시오. 보다 복잡한 경우-데몬의 작동 방식과 프로세스 간 통신 (IPC)에 대한 잠금 / 세마포어 사용 방법에 대한 올바른 질문을하거나 연구해야합니다.
행운을 빕니다.