2013-09-06 1 views
0

this, thisthis에서 팁을 사용하여 마침내 일련의 파일 백업 스크립트를 사용할 수있게되었습니다. 그러나 내가 해결할 수 없었던 작은 것이 하나 있습니다. 나는이 스크립트를 실행할 때 런타임 오류가 있지만,이 PowerShell 스크립트가 예기치 않은 파일 경로를 구성하는 이유는 무엇입니까?

$originalPath = "\\Server\Path\_testData\" 
$backupPath = "\\Server\Path\_backup\" 
#  
function supportBackup 
{ 
    "$($originalPath) copying DOC XLS PPT JPG GIF PDF WAV AVI to $($backupPath)" 
    Get-ChildItem $originalPath\* -Include *.doc*, *.xls*, *.ppt*, *.jpg, *.gif, *.pdf, *.wav, *.avi | ` 
    foreach { 
    $targetFile = $backupPath + $_.FullName.SubString($originalPath.Length); 
    New-Item -ItemType File -Path $targetFile -Force; 
    Copy-Item $_.FullName -destination $targetFile 
    } 
    "Support File Backup Completed" 
} 
supportBackup 

원래 파일 경로는 파일을 대상 디렉토리로 덤프하지 않고 됩니다.

내가 원하는 것은 :

\\Server\Path\_backup\files-from-testData-directory 

내가 무엇을 얻을 :

\\Server\Path\_backup\_testData\files-from-testData-directory 

나는 문제가 밀접하게 this question에 (동일하지 않은 경우)와 관련이 알고 있지만, 그것을 공부하고 일부를 적용하려고 후 그곳의 지혜에 대해 변수 들인 $_.Name의 다양한 반복을 사용하여, 나는 내가 생각한만큼 좋은 이해를하지 못한다는 것을 깨닫습니다. 나는 목적지 경로와 파일 이름이 주어진 변수로 어떻게 생성되는지와 원하는 결과를 얻기 위해 어떤 대체 변수 (또는 코드)를 사용해야하는지 설명 할 누군가가 필요하다. 나를 위해 클릭하지 않는 무언가가 있습니다. 이해하는 데 도움이 필요합니다.

+1

파이프 기호가있는 줄을 끝내면 백틱이 필요하지 않습니다. PowerShell은 자동으로 다음 줄을 파이프 라인을 계속 해석합니다. 그러나 필자는 개인적으로 파이프 기호가있는 줄을 시작하는 것이 더 명확하므로 멀티 라인 파이프에서 무엇이 파이프되어 있는지를 명확하게 알 수 있습니다. 이 경우 줄 바꿈을 벗어나기 위해 앞 줄 끝 부분에 backtick이 필요합니다. 그래서 저는 7 행을 역 따옴표로 끝내고 8 행을 다음과 같이 변경합니다 :'foreach {'. 그렇게 일반적인 스타일은 아니지만 복잡한 파이프 라인을 쉽게 따라 할 수 있다고 생각합니다. –

답변

5

너무 열심히 노력하고 있습니다. 이 충분해야합니다

파이프 할 수
$originalPath = '\\Server\Path\_testData' 
$backupPath = '\\Server\Path\_backup' 
$extensions = *.doc*,*.xls*,*.ppt*,*.jpg,*.gif,*.pdf,*.wav,*.avi 

function supportBackup { 
    "$($originalPath) copying DOC XLS PPT JPG GIF PDF WAV AVI to $($backupPath)" 
    Get-ChildItem "$originalPath\*" -Include $extensions | 
    Copy-Item -Destination "$backupPath\" -Force 
    "Support File Backup Completed" 
} 

supportBackup 

직접 Copy-FileGet-ChildItem의 결과. 대상 경로 이 백 슬래시로 끝나야합니다. 그렇지 않으면 명령이 폴더 $backupPath을 파일 이름으로 바꾸려고하므로 오류가 발생합니다.

+0

그게 내가 사본의 관점에서 필요로했던 ...하지만 내 파일 이름은 그들이 복사로 콘솔에 인쇄하지 않습니다. 나는 지금 당장 그것없이 살 수있다. :) – dwwilson66

+1

파일 이름이 성공 스트림이나 콘솔에 반향되어야한다면'Copy-Item -Destination "$ backupPath \"-Force'를'% {Copy-Item $ _. FullName -Destination "$ backupPath \"- 힘; 쓰기 출력 $ _. FullName}'. 콘솔에 출력하기 위해'Write-Output' 대신에'Write-Host'를 사용하십시오 (출력 파일로 재 지정할 수 없습니다). 콘솔 창에 파일 이름을 표시하면 성능이 크게 저하됩니다. –

+0

고마워, 그래 ... 나는 성능 저하를 느꼈지만, 테스트를 위해 나는 추가 된 보안을 좋아한다. 에코 파일 이름 위의 내 원래 코드 ... 쓰기 호스트가 없습니다. 콘솔에 어떤 섹션이 표시되는지 알고 계시나요? 거기에 콘솔에 대한 암시가 있습니까? – dwwilson66