Próbuję użyć robocopy wewnątrz programu PowerShell, aby utworzyć kopię lustrzaną niektórych katalogów na moich komputerach domowych. Oto mój skrypt:
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"
}
Skrypt pobiera plik csv z listą katalogów źródłowych i docelowych. Po uruchomieniu skryptu pojawiają się następujące błędy:
-------------------------------------------------------------------------------
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 !
Masz pomysł, co muszę zrobić, aby to naprawić?
Dzięki, Mark.
powershell
robocopy
Mark Allison
źródło
źródło
Wypełnianie ciągów do parametrów poleceń zewnętrznych z poziomu programu PowerShell wymaga przeskakiwania tamborka, jeśli chcesz mieć możliwość używania rozszerzania zmiennych, a także aby wynikowa linia poleceń poprawnie zrozumiała, które parametry chcesz oddzielić, a które nie. W twoim przykładzie wysyłasz cały łańcuch jako pierwszy parametr, a Robocopy mówi ci, że nie może znaleźć tego długiego łańcucha jako katalogu źródłowego. Chcesz, aby cały ciąg źródłowy był traktowany jako jeden parametr (w tym spacje, które mogą tam być), podobnie jak w przypadku miejsca docelowego, ale opcje $ what i $ zawiodą, ponieważ oba zostaną dostarczone do Robocopy jako pojedynczy parametr, którego nie można przeanalizowane.
Istnieje kilka sposobów na zrobienie tego dobrze, ale poniższy fragment kodu jest oparty na sposobie, w jaki wydaje się, że chcesz rozbić parametry i działa dla przykładu z jednym katalogiem, którego użyłem.
źródło
-match
i-replace
jak filtrowanie / cmdlet projekcyjne pracować z tym. Jest ogólnie dość dobrze zaprojektowany pod tym względem (większość*-Object
poleceń jest ortogonalna i wszystkie można zastosować do dowolnego obiektu).Usunąć cytaty z linii robocopy?
to znaczy
źródło
Miałem ten sam problem. Cały wiersz poleceń został zinterpretowany jako pierwszy argument.
Nic wyżej wspomnianego nie działało, w tym:
Pomijanie cudzysłowów nie działa, gdy na ścieżce jest miejsce:
Po wypróbowaniu sztuczek w http://edgylogic.com/blog/powershell-and-external-commands-done-right/ , w końcu go dostałem.
Może powinienem był trzymać pliki nietoperzy. :)
źródło
Odkryłem, że najlepszym sposobem na wykonanie natywnego polecenia jest użycie polecenia & do wykonania listy ciągów. Również jeśli chcesz, aby wyjście konsoli znalazło się w transkrypcie PowerShell, będziesz musiał przesłać wyjście do hosta zewnętrznego. Oto przykład wywołania 7Zip z wieloma parametrami pobranymi z 7-Zip do skryptu Powershell Amazon S3, który napisałem:
Zasadniczo w twoim przypadku spróbowałbym czegoś takiego (może być konieczne indywidualne wybranie parametrów $ what i $ options):
źródło
@
jeśli używasz programu PowerShell v3, aby podzielić listę rozdzielaną przecinkami na stos argumentówSpowoduje to interpolację wszystkich zmiennych, a następnie wywoła powstały ciąg. Tak jak teraz, wygląda na to, że robocopy jest wywoływane z cudzysłowami wokół wszystkich opcji, tj. Robocopy "c: \ src c: \ dst bla meh". Jest to interpretowane jako pojedynczy parametr.
źródło
To działało dla mnie i pozwala na dynamiczne wprowadzanie lokalizacji pliku dziennika. Symbol & mówi po prostu PowerShellowi, że tekst jest wierszem kodu, który chcę uruchomić.
źródło
Dodanie do tego moich 2 centów, ponieważ może to komuś pomóc ... W poniższym kodzie brakuje części „pętli”, w której czytam plik csv, aby pliki zostały skopiowane
źródło