J'essaie d'utiliser robocopy à l'intérieur de PowerShell pour mettre en miroir certains répertoires sur mes machines personnelles. Voici mon 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"
}
Le script prend un fichier csv avec une liste de répertoires source et de destination. Lorsque j'exécute le script, j'obtiens ces erreurs:
-------------------------------------------------------------------------------
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 !
Une idée de ce que je dois faire pour réparer?
Merci, Mark.
powershell
robocopy
Mark Allison
la source
la source
Le remplissage des chaînes dans les paramètres des commandes externes à partir de Powershell nécessite un saut de cerceau si vous voulez pouvoir utiliser l'expansion variable et que la ligne de commande résultante comprenne correctement quels paramètres vous souhaitez séparer et lesquels ne devraient pas. Dans votre exemple, vous envoyez la chaîne entière comme premier paramètre et Robocopy vous dit qu'il ne peut pas trouver cette longue chaîne comme répertoire source. Vous voulez que la chaîne Source entière soit traitée comme un paramètre (y compris les espaces qui peuvent s'y trouver), de même pour Destination, mais vos options $ what et $ échoueront car elles seront toutes deux livrées à Robocopy en tant que paramètre unique qui ne peut pas être analysé.
Il existe plusieurs façons de le faire correctement, mais l'extrait de code suivant est basé sur la façon dont vous semblez vouloir décomposer vos paramètres et fonctionne pour l'exemple de répertoire unique que j'ai utilisé.
la source
-match
et-replace
ainsi que le filtrage / cmdlets de projection de travailler avec ça. Il est généralement assez bien conçu à cet égard (la plupart des*-Object
commandes sont orthogonales et elles peuvent toutes être appliquées à n'importe quel objet).Supprimer les guillemets de la ligne robocopy?
c'est à dire
la source
J'ai eu le même problème. La ligne de commande entière a été interprétée comme le premier argument.
Rien de mentionné ci-dessus n'a fonctionné, y compris:
Oublier les guillemets ne fonctionne pas lorsqu'il y a un espace sur le chemin:
Après avoir essayé les astuces sur http://edgylogic.com/blog/powershell-and-external-commands-done-right/ , je l'ai finalement compris.
Peut-être que j'aurais dû m'en tenir aux fichiers de chauve-souris. :)
la source
J'ai trouvé que la meilleure façon d'exécuter une commande native est d'utiliser la commande & pour exécuter une liste de chaînes. De plus, si vous souhaitez que la sortie de la console soit incluse dans une transcription PowerShell, vous devrez diriger la sortie vers l'hôte externe. Voici un exemple d'appel de 7Zip avec plusieurs paramètres extraits d'un script 7-Zip vers Amazon S3 Powershell que j'ai écrit:
Fondamentalement, pour votre cas, j'essaierais quelque chose comme ça (peut-être besoin de décomposer les paramètres $ what et $ options individuellement):
la source
@
si vous utilisez powershell v3 pour diviser une liste séparée par des virgules en une pile d'argumentsCela interpolera toutes les variables, puis appellera la chaîne résultante. De la façon dont vous l'avez maintenant, il semble que robocopy soit invoqué avec les guillemets autour de toutes les options, c'est-à-dire, robocopy "c: \ src c: \ dst blah meh". Ceci est interprété comme un seul paramètre.
la source
Cela a fonctionné pour moi et permet une entrée dynamique de l'emplacement du fichier journal. le symbole & indique simplement à PowerShell que le texte est une ligne de code que je veux exécuter.
la source
Ajouter mes 2 cents à cela car cela peut aider quelqu'un ... Le code ci-dessous manque la partie "boucle" où je lis un csv pour obtenir les fichiers à copier
la source