Ich versuche, Robocopy in Powershell zu verwenden, um einige Verzeichnisse auf meinen Heimcomputern zu spiegeln. Hier ist mein Drehbuch:
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"
}
Das Skript nimmt eine CSV-Datei mit einer Liste von Quell- und Zielverzeichnissen auf. Wenn ich das Skript ausführe, erhalte ich folgende Fehlermeldungen:
-------------------------------------------------------------------------------
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 !
Irgendeine Idee, was ich tun muss, um das Problem zu beheben?
Danke, Mark.
powershell
robocopy
Mark Allison
quelle
quelle
Das Auffüllen von Zeichenfolgen in Parameter für externe Befehle aus Powershell erfordert einen gewissen Rahmensprung, wenn Sie die Variablenerweiterung verwenden möchten und die resultierende Befehlszeile genau verstehen soll, welche Parameter Sie trennen möchten und welche nicht. In Ihrem Beispiel senden Sie die gesamte Zeichenfolge als ersten Parameter und Robocopy teilt Ihnen mit, dass die lange Zeichenfolge nicht als Quellverzeichnis gefunden werden kann. Sie möchten, dass die gesamte Quellzeichenfolge als ein Parameter behandelt wird (einschließlich der Leerzeichen, die sich möglicherweise darin befinden), ebenso für Destination, aber Ihre Optionen $ what und $ schlagen fehl, da beide als ein einziger Parameter an Robocopy übergeben werden, der nicht vorhanden sein kann analysiert.
Es gibt einige Möglichkeiten, dies richtig zu machen, aber das folgende Snippet basiert auf der Art und Weise, wie Sie Ihre Parameter aufschlüsseln möchten, und funktioniert für das einzelne Verzeichnis, das ich verwendet habe.
quelle
-match
und-replace
sowie Filter- / Projektions-Cmdlets damit zu arbeiten. In dieser Hinsicht ist es im Allgemeinen recht gut gestaltet (die meisten*-Object
Befehle sind orthogonal und können auf jedes Objekt angewendet werden).Entfernen Sie die Anführungszeichen aus der Robocopy-Zeile?
dh
quelle
Ich hatte das gleiche problem Die gesamte Befehlszeile wurde als erstes Argument interpretiert.
Nichts oben Erwähntes hat funktioniert, einschließlich:
Das Weglassen der Anführungszeichen funktioniert nicht, wenn der Pfad ein Leerzeichen enthält:
Nachdem ich die Tricks in http://edgylogic.com/blog/powershell-and-external-commands-done-right/ ausprobiert hatte , bekam ich es endlich.
Vielleicht hätte ich mich an Fledermausfeilen festhalten sollen. :)
quelle
Ich habe festgestellt, dass die beste Möglichkeit, einen nativen Befehl auszuführen, darin besteht, mit dem Befehl & eine Liste von Zeichenfolgen auszuführen. Auch wenn Sie möchten, dass die Konsolenausgabe in ein Powershell-Transkript aufgenommen wird, müssen Sie die Ausgabe an den Out-Host weiterleiten. Hier ist ein Beispiel für den Aufruf von 7Zip mit mehreren Parametern, die aus einem von mir geschriebenen 7-Zip-Powershell-Skript für Amazon S3 stammen :
Grundsätzlich würde ich für Ihren Fall so etwas versuchen (muss möglicherweise die Parameter $ what und $ options einzeln aufschlüsseln):
quelle
@
wenn Sie Powershell v3 verwenden, um eine durch Kommas getrennte Liste in einen ArgumentenstapelDadurch werden alle Variablen interpoliert und die resultierende Zeichenfolge aufgerufen. So wie Sie es jetzt haben, sieht es so aus, als würde Robocopy mit den Anführungszeichen um alle Optionen aufgerufen, dh Robocopy "c: \ src c: \ dst blah meh". Dies wird als einzelner Parameter interpretiert.
quelle
Dies hat bei mir funktioniert und ermöglicht eine dynamische Eingabe des Speicherorts der Protokolldatei. Das Symbol & weist PowerShell lediglich darauf hin, dass der Text eine Codezeile ist, die ich ausführen möchte.
quelle
Das Hinzufügen meiner 2 Cent dazu, da es jemandem helfen könnte ... Im folgenden Code fehlt der "Schleifen" -Teil, in dem ich eine CSV-Datei lese, um die zu kopierenden Dateien zu erhalten
quelle