2016-07-27 2 views
0

내 개발 컴퓨터를 Powershell 5로 업그레이드했는데 PS2에서 작동하는 코드가 PS5에없는 코드를 작성했습니다.Robocopy with Powershell 5

내 코드는 Robocopy를 사용하여 svn 체크 아웃 디렉토리에서 작업 디렉토리로 파일을 복사합니다. 또한 작업 디렉토리를 정리하는 데 사용됩니다.

원래의 코드는 다음과 같습니다 : 명령이 PowerShell을 5를 사용하여 실행하면 I, 그것은 하나의 명령과 매개 변수를 취급하고 무엇을 발생하는 것을 볼

$what = @("""/copy:DAT""","""/E""","/XD .svn","/XD Debug","/XF .pdb") 
    $options = @("""/R:4""","""/W:5""","""/TS""","""/NS""","""/Tee""","""/NP""") 
    if ($file) { 
     $cmdArgs = @("""$src""", """$dest""", """$file""", $what, $options) 
    }else 
    { 
     $cmdArgs = @("""$src""", """$dest""", $what, $options) 
    } 
    robocopy $cmdArgs 

내가

ERROR : Invalid Parameter #3 : "/copy:DAT /E /XD .svn /XD Debug /XF .pdb"

을 얻을 오히려 별도의 매개 변수보다. 단일 큰 따옴표를 시도했지만, 작은 따옴표를 시도했지만 동일한 결과를 얻습니다.

내가 하드 코드 실행 라인에 옵션,

robocopy $cmdArgs /COPY:DAT /E /XD .svn /XD Debug /XF .pdb /R:4 /W:5 /TS /NS /Tee /NP

다음 명령이 작동합니다, 그래서 지금은 해결 방법을 가지고 있지만, 여전히 오히려 원래의 매개 변수 구조를했을 경우.

PS5에서이 기능을 사용하려면 어떻게해야합니까? 고맙습니다.

편집 : 내가 가지고있는 '/ XD을 .svn'를 들어 "/ XD을 .svn"

$what = @("""/PURGE""","""/E""","/XD .svn","/XD Debug","/XF .pdb") 
$options = @("""/R:4""","""/W:5""","""/TS""","""/NS""","""/Tee""","""/NP""") 
$cmdArgs = @("""$srcBase""","""$targetPath"""; $what) 

: 오류 : 잘못된 매개 변수 # 5 윈도우 10와 PS5으로, 나는 다음과 같은 오류를 얻고있다 삼중 따옴표, 작은 따옴표, 이스케이프 된 따옴표 등으로 묶으려고했으나 성공하지 못했습니다.

+0

', $ what, $ options' ->'; $ what; $ options' – PetSerAl

+0

제안 해 주셔서 감사합니다. 그러나 같은 문제로 실패합니다. 누군가 PowerShell 5를 사용하여 동일한 시나리오를 시도해 볼 수 있습니까? 이것이 내가 들쭉날쭉 한 배열이라는 것을 알고 있으며, PowerShell이 ​​혼란스러워하는 곳이라고 생각합니다. 그러나 PowerShell에서 robocopy를 실행하는 방법이 필요합니다. –

답변

0

와우! 고통 스럽지만 해결책이 있습니다. 문자열 분할 방법을 사용하고 공백으로 분할해야했습니다. 배열을 버리고 하나의 문자열을 만들어야했습니다.

$cmdArgs = @("""$srcBase""", """$targetPath""") #still required for quoted paths 
$what = "/PURGE /E /XD .svn /XD DEBUG /XF .pdb" 
$options = "/R:4 /W:5 /TS /NS /Tee /NP" 
robocopy $cmdArgs $what.split(' ') $options.split(' ') 

PS 2.0 이상 버전이 내 코드를 변경 한 것으로 변경되었지만 해결 된 것 같습니다. 다행히도 이것은 고통의 날로부터 다른 사람들을 구하는 데 도움이됩니다. :)

EDIT :이 값을 가진 매개 변수가 제대로 평가되지 않는 PS와 Robocopy 사이의 문제라고 생각합니다. 나를 괴롭히는 것은 매개 변수로 간단한 문자열을 시도하는 데 많은 노력이 필요하다는 것입니다.

0

지그재그 배열을 만들고 있습니다. 당신은 당신이

"" 
"" 
"/copy:DAT" 
"/E" 
/XD .svn 
/XD Debug 
/XF .pdb 
"/R:4" 
"/W:5" 
"/TS" 
"/NS" 
"/Tee" 
"/NP" 

이 바로 보이는이 포함 된 코드를 실행 한 후 $ cmdargs의 결과를 보면이를 확인할 수 있지만, 당신은 단지 세 번째 요소 $의 cmdArgs에 액세스하는 경우 [2] 당신은 전체를 포함하는 것으로 볼 수있다 위의 약간의 편집 및:

$what = @("""/copy:DAT""","""/E""","/XD .svn","/XD Debug","/XF .pdb") 
    $options = @("""/R:4""","""/W:5""","""/TS""","""/NS""","""/Tee""","""/NP""") 
    if ($file) { 
     $cmdArgs = @("""$src""", """$dest""", """$file""") 
     $cmdArgs += $what 
     $cmdArgs += $options 
    }else 
    { 
     $cmdArgs = @("""$src""", """$dest""") 
     $cmdArgs += $what 
     $cmdArgs += $options 
    } 
    robocopy $cmdArgs 

편집 : $의 내용은 신속하고 더러운 해결 방법으로 어떤 배열

"/copy:DAT" 
"/E" 
/XD .svn 
/XD Debug 
/XF .pdb 

, 다음을 시도More on Jagged vs Multidimensional vs standard arrays here. 바닥을보세요. 기본적으로 배열을 만드는 방법은 @ (0,1, (0,1,2,3,4), (0,1,2,3,4,5))로 해석됩니다.

+0

응답 지연으로 인해 유감스럽게 생각합니다. 긴급 상황의 폭력이었습니다. :) 저는 Windows 10 x86 시스템을 사용하고 있으며 물론 PowerShell 5를 사용하고 있으며 여전히 동일한 문제가 발생합니다. 제대로 구문 분석하는 명령 줄을 제대로 구성 할 수 없습니다. PowerShell 2.0 시스템으로 돌아 가면 명령 줄이 완벽하게 분석됩니다. 위의 제안을 시도했지만 같은 결과가납니다. –

0

따옴표가 너무 많습니다. 원본 경로와 대상 경로를 제외하고는 실제로는 필요하지 않습니다. 내가 찾은 가장 좋은 방법은 형식화 된 문자열 표현식을 작성한 다음 실행하는 것입니다.

$what = "/copy:DAT /E /XD .svn /XD Debug /XF .pdb" 
$options = "/R:4 /W:5 /TS /NS /Tee /NP" 
$source = "C:\DataSource" 
$destination = "D:\DataDestination" 

$expression = [string]::Format('ROBOCOPY "{0}" "{1}" {2} {3}', $source,$Destination,$what,$options) 
$rc = Invoke-Expression $expression 
$rc = $LASTEXITCODE; 
    Switch ($rc) 
{ 
    0 {$msg = 'No files were copied. No failure was encountered. No files were mismatched.'} 
    1 {$msg = 'All files were copied successfully.'} 
    2 {$msg = 'There are some additional files in the destination directory that are not present in the source directory. No files were copied.'} 
    3 {$msg = 'Some files were copied. Additional files were present. No failure was encountered.'} 
    5 {$msg = 'Some files were copied. Some files were mismatched. No failure was encountered.'} 
    6 {$msg = 'Additional files and mismatched files exist. No files were copied and no failures were encountered. This means that the files already exist in the destination directory.'} 
    7 {$msg = 'Files were copied, a file mismatch was present, and additional files were present.'} 
    8 {$msg = 'Several files did not copy.'} 
    default {$msg = 'Robocopy failed with an error'} 
} 
$msg 
If($rc -ge 8) {Throw}