Estoy tratando de usar robocopy dentro de powershell para reflejar algunos directorios en mis máquinas domésticas. Aquí está mi guión:
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 un archivo csv con una lista de directorios de origen y destino. Cuando ejecuto el script obtengo 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.
powershell
robocopy
Mark Allison
fuente
fuente
Completar cadenas en parámetros para comandos externos desde Powershell requiere un salto de aro si desea poder utilizar la expansión variable y también hacer que la línea de comandos resultante entienda correctamente qué parámetros desea separar y cuáles no. En su ejemplo, está enviando la cadena completa como primer parámetro y Robocopy le dice que no puede encontrar esa cadena larga como directorio de origen. Desea que toda la cadena de origen se trate como un parámetro (incluidos los espacios que pueden estar allí), del mismo modo para el destino, pero sus opciones $ what y $ fallarán porque ambas se entregarán a Robocopy como un parámetro único que no puede ser analizado
Hay algunas maneras de hacer esto bien, pero el siguiente fragmento se basa en la forma en que parece querer desglosar sus parámetros y funciona para el ejemplo de directorio único que he usado.
fuente
-match
y-replace
también cmdlets de filtrado / proyección para trabajar con eso. En general, está bastante bien diseñado en ese sentido (la mayoría de los*-Object
comandos son ortogonales y todos se pueden aplicar a cualquier objeto).¿Eliminar las comillas de la línea robocopy?
es decir
fuente
Yo tuve el mismo problema. Toda la línea de comando fue interpretada como el primer argumento.
Nada de lo mencionado anteriormente funcionó, incluyendo:
Dejar las comillas no funciona cuando hay un espacio en el camino:
Después de probar los trucos en http://edgylogic.com/blog/powershell-and-external-commands-done-right/ , finalmente lo entendí.
Tal vez debería haberme quedado con los archivos bat. :)
fuente
He descubierto que la mejor manera de ejecutar un comando nativo es usar el comando & para ejecutar una lista de cadenas. Además, si desea que la salida de la consola se incluya en una transcripción de PowerShell, deberá canalizar la salida a un host externo. Aquí hay un ejemplo de cómo llamar a 7Zip con múltiples parámetros tomados de un 7-Zip a Amazon S3 Powershell Script que escribí:
Básicamente para su caso, intentaría algo como esto (puede que necesite separar los parámetros $ what y $ options individualmente):
fuente
@
si está usando powershell v3 para dividir una lista separada por comas en una pila de argumentosEsto interpolará todas las variables, luego llamará a la cadena resultante. De la forma en que lo tiene ahora, parece que se está invocando robocopy con las comillas alrededor de todas las opciones, es decir, robocopy "c: \ src c: \ dst blah meh". Esto se interpreta como un solo parámetro.
fuente
Esto funcionó para mí y permite una entrada dinámica de la ubicación del archivo de registro. el símbolo & solo le dice a PowerShell que el texto es una línea de código que quiero ejecutar.
fuente
Agregar mis 2 centavos a esto, ya que puede ayudar a alguien ... Al código siguiente le falta la parte del "bucle" donde leo un csv para que los archivos se copien
fuente