Estou tentando usar a robocopy dentro do powershell para espelhar alguns diretórios em minhas máquinas domésticas. Aqui está o meu 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"
}
O script utiliza um arquivo csv com uma lista de diretórios de origem e destino. Quando executo o script, recebo estes erros:
-------------------------------------------------------------------------------
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 !
Alguma idéia do que eu preciso fazer para corrigir?
Obrigado, Mark.
powershell
robocopy
Mark Allison
fonte
fonte
Preencher cadeias de caracteres em parâmetros para comandos externos de dentro do Powershell exige alguns saltos de argola se você quiser usar expansão variável e também fazer com que a linha de comando resultante entenda corretamente quais parâmetros você deseja separar e quais não devem. No seu exemplo, você está enviando a cadeia inteira como o primeiro parâmetro e o Robocopy está dizendo que não pode encontrar essa cadeia longa como um diretório de origem. Você deseja que toda a cadeia de origem seja tratada como um parâmetro (incluindo espaços que possam estar lá), da mesma forma que para Destino, mas suas opções $ what e $ falharão porque ambas serão entregues ao Robocopy como um único parâmetro que não pode ser analisado.
Existem algumas maneiras de fazer isso da maneira certa, mas o seguinte trecho é baseado na maneira como você parece querer quebrar seus parâmetros e funciona no exemplo de diretório único que eu usei.
fonte
-match
e-replace
, assim como a filtragem / cmdlets de projeção trabalhar com isso. Geralmente, é bem projetado nesse sentido (a maioria dos*-Object
comandos é ortogonal e todos podem ser aplicados a qualquer objeto).Remover as aspas da linha de robocópia?
ie
fonte
Eu tive o mesmo problema. Toda a linha de comando foi interpretada como o primeiro argumento.
Nada mencionado acima funcionou, incluindo:
Deixar as aspas não funciona quando há um espaço no caminho:
Depois de tentar os truques em http://edgylogic.com/blog/powershell-and-external-commands-done-right/ , finalmente entendi.
Talvez eu devesse ter ficado com os arquivos bat. :)
fonte
Eu descobri que a melhor maneira de executar um comando nativo é usar o comando & para executar uma lista de strings. Além disso, se você deseja que a saída do console seja incluída em uma transcrição do PowerShell, será necessário canalizar a saída para o host externo. Aqui está um exemplo de chamada ao 7Zip com vários parâmetros extraídos de um 7-Zip para o Amazon S3 Powershell Script que eu escrevi:
Basicamente, para o seu caso, eu tentaria algo assim (talvez seja necessário quebrar os parâmetros de opções $ what e $ individualmente):
fonte
@
se você estiver usando powershell v3 para dividir uma lista separada por vírgula em uma pilha de argumentoIsso interpolará todas as variáveis e chamará a sequência resultante. Do jeito que você tem agora, parece que a robocópia está sendo chamada com aspas em todas as opções, ou seja, robocopy "c: \ src c: \ dst blah meh". Isso é interpretado como um único parâmetro.
fonte
Isso funcionou para mim e permite uma entrada dinâmica do local do arquivo de log. o símbolo & diz ao PowerShell que o texto é uma linha de código que eu quero executar.
fonte
Adicionando meus 2 centavos a isso, pois isso pode ajudar alguém ... O código abaixo está faltando a parte "loop" onde eu li um csv para obter os arquivos para copiar
fonte