Powershell에서 robocopy를 실행하는 방법은 무엇입니까? /W:0 /NFL /NDL” $logDir = “C:\Backup\” foreach

powershell 내부에서 robocopy를 사용하여 가정용 컴퓨터의 일부 디렉토리를 미러링하려고합니다. 내 스크립트는 다음과 같습니다.

param ($configFile)

$config = Import-Csv $configFile
$what = "/COPYALL /B /SEC/ /MIR"
$options = "/R:0 /W:0 /NFL /NDL"
$logDir = "C:\Backup\"

foreach ($line in $config)
{
 $source = $($line.SourceFolder)
 $dest = $($line.DestFolder)
 $logfile =  $logDIr
 $logfile += Split-Path $dest -Leaf
 $logfile += ".log"

 robocopy "$source $dest $what $options /LOG:MyLogfile.txt"
}

이 스크립트는 소스 및 대상 디렉토리 목록이 포함 된 csv 파일을받습니다. 스크립트를 실행할 때 다음 오류가 발생합니다.

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------

  Started : Sat Apr 03 21:26:57 2010

   Source : P:\ C:\Backup\Photos \COPYALL \B \SEC\ \MIR \R:0 \W:0 \NFL \NDL \LOG:MyLogfile.txt\
     Dest -

    Files : *.*

  Options : *.* /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------

ERROR : No Destination Directory Specified.

       Simple Usage :: ROBOCOPY source destination /MIR

             source :: Source Directory (drive:\path or \\server\share\path).
        destination :: Destination Dir  (drive:\path or \\server\share\path).
               /MIR :: Mirror a complete directory tree.

    For more usage information run ROBOCOPY /?


****  /MIR can DELETE files as well as copy them !

내가 고치기 위해 무엇을해야하는지 아는가?

고마워 마크



답변

대한 변수 경우 $what와는 $options변경되지 않습니다, 그들은 왜 변수?

$what = "/COPYALL /B /SEC /MIR"
$options = "/R:0 /W:0 /NFL /NDL" 

이것은 나를 위해 잘 작동합니다 :

robocopy   $source $dest /COPYALL /B /SEC /MIR /R:0 /W:0 /NFL /NDL

답변

Powershell 내에서 외부 명령에 대한 문자열을 매개 변수에 채우려면 변수 확장을 사용하고 결과 명령 줄에서 분리하려는 매개 변수와 그렇지 않은 매개 변수를 올바르게 이해하려면 약간의 점프 점프가 필요합니다. 귀하의 예에서 전체 문자열을 첫 번째 매개 변수로 보내고 Robocopy는 긴 문자열을 소스 디렉토리로 찾을 수 없음을 알려줍니다. Destination과 마찬가지로 전체 소스 문자열을 하나의 매개 변수 (여기에있을 수있는 공백 포함)로 처리하려고하지만 $ what 및 $ options는 단일 매개 변수로 Robocopy에 전달되므로 실패합니다. 파싱되었습니다.

이 작업을 올바르게 수행하는 몇 가지 방법이 있지만 다음 스 니펫은 매개 변수를 분해하려는 것처럼 보이는 방식을 기반으로하며, 내가 사용한 단일 디렉토리 예제에서 작동합니다.

$source="C:\temp\source"
$dest="C:\temp\dest"

$what = @("/COPYALL","/B","/SEC","/MIR")
$options = @("/R:0","/W:0","/NFL","/NDL")

$cmdArgs = @("$source","$dest",$what,$options)
robocopy @cmdArgs

답변

robocopy 라인에서 따옴표를 제거 하시겠습니까?

param ($configFile)

$config = Import-Csv $configFile
$what = "/COPYALL /B /SEC/ /MIR"
$options = "/R:0 /W:0 /NFL /NDL"
$logDir = "C:\Backup\"

foreach ($line in $config)
{
 $source = $($line.SourceFolder)
 $dest = $($line.DestFolder)
 $logfile =  $logDIr
 $logfile += Split-Path $dest -Leaf
 $logfile += ".log"

 robocopy $source $dest $what $options /LOG:MyLogfile.txt
}

답변

나는 같은 문제가 있었다. 전체 명령 행이 첫 번째 인수로 해석되었습니다.

위에서 언급 한 것은 다음을 포함하여 작동하지 않았습니다.

invoke-expression "robocopy ""$sourceFolder"" ""$destinationFolder"" /MIR"
invoke-expression "robocopy \`"$sourceFolder\`" \`"$destinationFolder\`" /MIR"  

경로에 공백이 있으면 인용 부호를 남겨두면 작동하지 않습니다.

invoke-expression "robocopy $sourceFolder $destinationFolder /MIR"  

http://edgylogic.com/blog/powershell-and-external-commands-done-right/ 의 트릭을 시도한 후에 마침내 얻었습니다.

robocopy "\`"$sourceFolder"\`" "\`"$destinationFolder"\`" /MIR

아마도 박쥐 파일을 고수했을 것입니다. 🙂


답변

네이티브 명령을 실행하는 가장 좋은 방법은 & 명령을 사용하여 문자열 목록을 실행하는 것입니다. 또한 콘솔 출력을 powershell 스크립트에 포함 시키려면 출력을 호스트 외부로 파이프해야합니다. 다음은 7-Zip에서 Amazon S3 Powershell Script로 가져온 여러 매개 변수를 사용하여 7Zip을 호출하는 예입니다 .

$7ZipPath = "C:\Program Files\7-Zip\7z.exe" #Path to 7Zip executable
$FolderPath = "C:\Backup" #Folder to backup (no trailing slash!)
$FolderName = $FolderPath.Substring($FolderPath.LastIndexOf("\")+1) #grab the name of the backup folder
$TimeStamp = [datetime]::Now.ToString("yyyy-MM-dd_HHmm") #Create unique timestamp string
$strFile = [String]::Format("{0}\{1}_{2}.7z", "c:\",$FolderName,$TimeStamp) #Create filename for the zip
#7z options: add, type 7z, Archive filename, Files to add (with wildcard. Change \* to \prefix* or \*.txt to limit files), compression level 9, password, encrypt filenames, Send output to host so it can be logged.
& $7ZipPath "a" "-t7z" "$strFile" "$FolderPath\*" "-mx9" "-r" "-pPASSWORD" "-mhe" | out-host #create archive file
if($LASTEXITCODE -ne 0){ #Detect errors from 7Zip. Note: 7z will crash sometimes if file already exists
    Write-Error "ERROR: 7Zip terminated with exit code $LASTEXITCODE. Script halted."
    exit $LASTEXITCODE
}

기본적으로 귀하의 경우 다음과 같이 시도합니다 ($ what 및 $ options 매개 변수를 개별적으로 분리해야 할 수도 있음).

$robocopypath = "c:\pathtofolder\robocopy.exe"
& $robocopypath "$source" "$dest" "$what" "$options" "/LOG:MyLogfile.txt"

답변

invoke-expression "robocopy $source $dest $what $options /LOG:MyLogfile.txt"

모든 변수를 보간 한 다음 결과 문자열을 호출합니다. 당신이 지금 가지고있는 방법은 robocopy “c : \ src c : \ dst blah meh”와 같은 모든 옵션 주위에 따옴표로 robocopy가 호출되는 것처럼 보입니다. 이것은 단일 매개 변수로 해석됩니다.


답변

이것은 나를 위해 일했고 로그 파일 위치의 동적 입력을 허용합니다. & 기호는 PowerShell에 텍스트가 실행하려는 코드 줄임을 나타냅니다.

    $source = "E:\BackupToRestore\"
    $destination = "E:\RestoreMe\"
    $logfile = "E:\robocopyLogFile.txt"
    $switches = ("/B", "/MIR", "/XJ", "/FFT", "/R:0", "/LOG:$logfile")
    & robocopy $source $destination $roboCopyString $switches