25 votos

¿Cómo obtener robocopy en powershell?

Intento utilizar robocopy dentro de powershell para algunos directorios en mis casa máquinas del espejo. Aquí está mi script:

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"
}

El script toma en un archivo csv con un listado de directorios de origen y de destino. Cuando ejecuto el script me sale estos errores:

-------------------------------------------------------------------------------
   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 !

¿Alguna idea de lo que necesito hacer para arreglar?

Gracias, Mark.

3voto

Bryan Puntos 5634

¿Retire las citas de la línea de robocopy?

es decir

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
}

3voto

Justin Puntos 11

Yo tenía el mismo problema. Toda la línea de comandos que fue interpretado como el primer argumento.

Nada se mencionó anteriormente trabajado, incluyendo:

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

Dejando las comillas no funciona cuando hay un espacio en la ruta:

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

Después de intentar los trucos en http://edgylogic.com/blog/powershell-and-external-commands-done-right/, por fin lo conseguí.

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

Tal vez debería haber quedado con archivos bat. :)

1voto

Tony Eichelberger Puntos 1586

Rellenar las cadenas en los parámetros de comandos externos desde dentro de Powershell requiere algunos aro de salto si usted quiere ser capaz de utilizar la expansión de la variable y también tienen la resultante de la línea de comandos de comprender adecuadamente los parámetros que desea ser separados y que no debe. En su ejemplo, usted está enviando toda la cadena como primer parámetro y Robocopy está diciendo que no puede encontrar esa cadena larga como un directorio de origen. Desea que la totalidad de la cadena de Origen a ser tratado como uno param (incluyendo los espacios que pueden estar ahí), al igual que para el Destino, pero su $lo y $opciones fallará porque ambos serán entregados a Robocopy como un único parámetro que no puede ser analizado.

Hay un par de maneras de hacer esto bien, pero el siguiente fragmento de código se basa en la forma en que se parecen querer romper sus parámetros y hace el trabajo para el directorio único ejemplo que he utilizado.

$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

1voto

Greg Bray Puntos 2305

He encontrado que la mejor manera de ejecutar un comando nativo es utilizar el comando a ejecutar una lista de cadenas. También si desea que la salida de la consola para ser incluido en un powershell transcripción necesitará tubo de la salida out-host. Aquí está un ejemplo de llamada 7Zip con múltiples parámetros que se toman de un 7-Zip en Amazon S3 Script de Powershell que me escribió:

$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
}

Básicamente para tu caso me gustaría intentar algo como esto (puede necesitar para romper el $lo y $opciones de parámetros de forma individual):

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

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: