공백이있는 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
예약 된 작업을 편집 할 때 프로그램 / 스크립트 섹션 또는 인수 추가 (선택 사항) 섹션에 인수를 넣 습니까?
윌리엄 잭슨

올바른 인수 줄 바꿈은 예약 된 택이 아닌 프로그램의 재량에 따라 정확하게 사용중인 프로그램을 지정하면 도움이됩니다. 예를 들어, WinSCP는 따옴표를 중첩해야 할 때 큰 따옴표 ( ""... "")를 예상합니다.
Tobias Plutat

1) 실패한 작업, 작업 또는 .exe 및 2) 정확하게 입력 한 내용과 TaskSched UI의 위치에 대해서는 확실하지 않습니다. TaskSched가 명령 (실행 파일의 전체 경로)을 요구하는 곳에서 명령 줄 (매우 다른 것)을 주려고합니까?
kreemoweet

배치 파일에 반대하는 이유는 무엇입니까? 일을 그렇게 간단하게 만듭니다! 모험심이 있다면 파워 쉘 스크립트를 쏴도됩니다.
tumchaaditya

답변:


6

예약 된 작업으로 작업했으며 일반적으로 인수를 자체 텍스트 입력 상자에 넣습니다. 즉, 프로그램 / 스크립트 필드에 대한 작업이 exe를 가리키고 "인수 추가"필드에 모든 매개 변수가 있어야합니다. ( 소스 )

블로그 이미지

이 동작은 파일 경로에서 exe 로의 공백을 방지하여 문제를 일으키는 것으로 추가되었습니다.

PowerShell 스크립트를 사용하여이 작업을 항상 수행합니다. 예를 들면 다음과 같습니다.

  • 프로그램 / 스크립트 : powershell.exe
  • 인수 추가 : -command "& 'C : \ HSD-Copy \ logoffstudents.ps1'"-NonInteractive
  • 시작 : 공백

고맙지 만 문제는 내 매개 변수 중 하나가 파일 경로이며 그 안에 공백이 있다는 것입니다. 예제 100에서는 작동하지만 "C : \ Start Folder"를 전달하려면 어떻게해야합니까?
Rodney

나는 단지 내 프로그램에서 따옴표를 사용하고 작동합니다. 앰퍼샌드는 Powershell에만 필요합니다. 이 기호는 CALL 연산자이며 powershell 명령을 불러올 수 있습니다. 대부분의 경우 따옴표 만 있으면됩니다. 이 시점에서 exe 작성자에게 연락하여 예약 된 작업을 지원하는지 확인할 수 있습니다. 나는 예약 된 작업으로 실행을 거부하는 드문 프로그램을 만났습니다. 문제를 일으킬 수있는 매개 변수가 전달되는 방식에는 미묘한 차이가 있다고 생각합니다. 더 도와 드릴 수 없어서 미안 해요
Doltknuckle

최악의 경우 공백을 제거하기 위해 폴더를 재구성 할 수 있습니다. 그것은 당신이 원하는 것이 아니지만 그것이 작동하게 만드는 유일한 방법 일 수 있습니다.
Doltknuckle

고마워요 Doltknuckle-.bat 파일로도 할 수 있다는 것을 알고 있습니다 (Powershell 스크립트에서와 같이 매개 변수 주위에 ""를 사용하십시오. Windows 작업 편집기 UI의 버그라고 확신합니다. .exe의 작성자입니다.)-테스트 하네스와 명령 프롬프트에서는 제대로 작동하지만 Windows UI에서는 작동하지 않습니다.
Rodney

1
exe를 만든 경우 이것은 stackoverflow에 대한 질문 일 수 있습니다. 이 exe가 예약 된 작업에 사용될 때 매개 변수 처리를 수정해야 할 수도 있습니다. 한 가지 제안은 exe가 파일에 수신 된 매개 변수를 로그에 기록하여 전달되는 내용을 볼 수있게하는 것입니다. 최소한 예약 된 작업 매개 변수가 명령 줄 매개 변수와 같은지 확인할 수 있습니다.
Doltknuckle

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 디렉토리 용.

그런 다음 cd "Program Files"를 사용하여 cd xyz로 디렉토리를 프로그램 파일로 변경 하고 dir /x다시 발행 하여"인터페이스 "의 8.3 형식 이름을 찾으십시오.

당신이 주신 예제의 최종 경로는 다음과 같습니다.

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

고마워, 나는 대답을 주셔서 감사하지만, 이것은 추가 문제를 일으 킵니다. 기본적으로 나는이 매개 변수 폴더 경로를 사용하여 작성한 EXE .NET 응용 프로그램을 호출합니다. 8.3 형식이 마음에 들지 않고 경로를 찾을 수 없습니다. 그래서 다른 방법이 있습니까?
Rodney

추신-이것이 Windows 예약 작업 앱의 버그입니까? 공간은 매우 일반적입니다!
Rodney

Windows 7의 빠른 테스트가 저에게 효과적입니다. 다양한 방법으로 작업을 설정하기 위해 수행 한 단계를 안내해 주실 수 있습니까? Gareth의 편집에 감사드립니다. 훨씬 멋지게 보입니다.
Keith

따라서이 형식으로 작업이 정상적으로 실행되지만 경로를 인수 문자열로 허용하는 .NET 프로그램이 8.3 형식의 경로를 압축 해제하지 않습니다. 아마도 8.3 질문을 처리하는 방법은 프로그래밍 질문 일 것입니다.
Rodney

나는 우리를 오래 알고 있지만 하이픈 (-)을 시도 했습니까?
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명령 직후 와 끝에 (after .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 파일 전송 \ FTPFileTransferTask.exe "C : \ Program Files \ xyz \ 인터페이스 \ 폴더 경로"


0

다른 관점에서 문제를 이해하는 데 도움이 될 수 있습니다. 작업 스케줄러를 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)에 대한 잠금 / 세마포어 사용 방법에 대한 올바른 질문을하거나 연구해야합니다.

행운을 빕니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.