Я пытаюсь использовать robocopy внутри powershell для зеркалирования некоторых каталогов на моих домашних машинах. Вот мой сценарий:
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"
}
Сценарий принимает файл CSV со списком каталогов источника и назначения. Когда я запускаю скрипт, я получаю следующие ошибки:
-------------------------------------------------------------------------------
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 !
Любая идея, что мне нужно сделать, чтобы исправить?
Спасибо, Марк.
powershell
robocopy
Марк Эллисон
источник
источник
Заполнение строк в параметры для внешних команд из Powershell требует некоторого скачка обруча, если вы хотите иметь возможность использовать расширение переменных, а также чтобы полученная командная строка правильно понимала, какие параметры вы хотите разделить, а какие - нет. В вашем примере вы отправляете всю строку в качестве первого параметра, и Robocopy сообщает вам, что не может найти эту длинную строку в качестве исходного каталога. Вы хотите, чтобы вся исходная строка рассматривалась как один параметр (включая пробелы, которые там могут быть), также как и для Destination, но ваши параметры $ what и $ потерпят неудачу, поскольку они оба будут доставлены в Robocopy как один параметр, который не может быть разобран.
Есть несколько способов сделать это правильно, но следующий фрагмент основан на том, как вы, кажется, хотите разбить ваши параметры, и работает для единственного примера каталога, который я использовал.
источник
-match
и-replace
так же , как фильтрация / проекционные командлеты работать с этим. Как правило, он достаточно хорошо разработан (большинство*-Object
команд ортогональны, и все они могут быть применены к любому объекту).Удалить цитаты из строки robocopy?
т.е.
источник
У меня такая же проблема. Вся командная строка была интерпретирована как первый аргумент.
Ничто из вышеперечисленного не сработало, включая:
Опускание кавычек не работает, когда в пути есть пробел:
Попробовав трюки в http://edgylogic.com/blog/powershell-and-external-commands-done-right/ , я наконец-то понял.
Может быть, я должен был застрял с файлами летучей мыши. :)
источник
Я обнаружил, что лучший способ выполнить нативную команду - использовать команду & для выполнения списка строк. Также, если вы хотите, чтобы вывод консоли был включен в стенограмму powershell, вам нужно будет направить вывод в out-host. Вот пример вызова 7Zip с несколькими параметрами, взятыми из сценария Powershell 7-Zip в Amazon S3, который я написал:
В основном для вашего случая я бы попробовал что-то вроде этого (может потребоваться отдельно выделить параметры $ what и $ options):
источник
@
если вы используете powershell v3 для разбиения списка через запятую в стек аргументовЭто будет интерполировать все переменные, а затем вызвать полученную строку. То, как вы сейчас это делаете, похоже, что robocopy вызывается с кавычками вокруг всех опций, то есть robocopy "c: \ src c: \ dst blah meh". Это интерпретируется как один параметр.
источник
Это работает для меня и позволяет динамически вводить местоположение файла журнала. символ & просто говорит PowerShell, что текст - это строка кода, которую я хочу запустить.
источник
Добавление моих 2 центов к этому, поскольку это может кому-то помочь ... В приведенном ниже коде отсутствует часть "цикла", где я читаю CSV, чтобы получить файлы для копирования
источник