2014-07-25 4 views
3

주어진 (소스) 디렉토리의 하위 디렉토리를 가져 와서 다른 (대상) 디렉토리에 일치하는 하위 디렉토리가 있는지 확인하는 스크립트를 작성했습니다. 목적지에 존재하면 서브 디렉토리의 내용을 목적지로 복사합니다. 여기에 지금까지 가지고 무엇을 : 변수의 $의 SRC 또는 $이 DST 그 안에 공간이없는 경우변수의 공백 - Powershell

$src = read-host "Enter Source Dir" 
$dst = read-host "Enter Destination Dir" 
$log = read-host "Enter Log File Name" 
foreach ($folder in Get-ChildItem -Path $src) 
{ 
if (-Not (Test-Path "$dst\$folder")) {} 
else {start-process robocopy.exe -ArgumentList "$src\$folder $dst\$folder /r:3 /w:5 /e /COPYALL /LOG+:D:\Temp\DataMigration\$log.log /zb /np /nc"} 
} 

모든 것이 매우 잘 작동합니다. 또한/XD Application Data 인수를 robocopy의 인수 목록에 추가하려고하지만 이름 응용 프로그램 데이터의 공백도 오류를 발생시킵니다.

스크립트에서 휴식이 아닌 공백으로 내가 필요한 공백을 어떻게 허용 할 수 있습니까?

감사합니다.

B

답변

2

당신은 단지 doubleqoutes와 원본 및 대상 경로를 포장해야하며, 즉시 다른 사람 안에 쌍 따옴표를 사용해야합니다, 당신이 그들 (내부 쌍 따옴표)를 탈출해야 것 같습니다. 몇 가지 방법이 있습니다. 그중 하나가 백틱 (`)을 사용하고 있습니다.

start-process robocopy.exe -ArgumentList "`"$src\$folder`" `"$dst\$folder`" /r:3 /w:5 /e /COPYALL /LOG+:D:\Temp\DataMigration\$log.log /zb /np /nc" 
+0

robocopy에/XD 플래그를 포함한 치료를했습니다! 답장을 보내 주셔서 감사합니다. – user3878432

2

왜 시작 프로세스를 사용하고 있습니까?

robocopy.exe $src\$folder $dst\$folder /r:3 /w:5 /e /COPYALL /LOG+:D:\Temp\DataMigration\$log.log /zb /np /nc 
+0

필자는 powershell에서 직접 호출하여 해당 복사본이 다음 작업으로 이동하기 전에 완료 될 때까지 일시 중지한다고 가정했으나 위의 스크립트를 사용하는 다른 "표준"스크립트에 기반하여 솔직히 체크하지 않았습니다. 나는 당신의 마음에 미래에 대한 제안을 곰, 감사합니다 키이스! – user3878432

2
-ArgumentList

올바른 형식이 배열과 같이 표시됩니다 : 당신은 PowerShell을 직접 ROBOCOPY를 호출 할 수 있습니다

Start-Process -Path 'robocopy.exe' -ArgumentList @(
      $(Join-Path -Path $src -ChildPath $folder), 
      $(Join-Path -Path $dst -ChildPath $folder), 
      '/r:3', 
      '/w:5', 
      '/e', 
      '/COPYALL', 
      '/LOG+:D:\Temp\DataMigration\$log.log', 
      '/zb', 
      '/np', 
      '/nc') 

그래서 배열의 각 요소는 별도의 인수를 할 것이고, 부분으로 나누어되지 않습니다 robocopy.exe

에서 arguments 매개 변수에 그리고 "$dst\$folder"

,691의 $(Join-Path -Path $dst -ChildPath $folder) istead을 사용하는 것이 더보다 더 낫다입니다
관련 문제