Powershell

如何讓 robocopy 在 powershell 中執行?

  • January 5, 2021

我正在嘗試在 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 告訴您它找不到那個長字元串作為源目錄。您確實希望將整個 Source 字元串視為一個參數(包括可能存在的空格),對於 Destination 也是如此,但您的 $ what and $ 選項將失敗,因為它們都將作為無法解析的單個參數傳遞給 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

引用自:https://serverfault.com/questions/129098