Eu tenho a seguinte linha de comando do robocopy:
robocopy $drv "B:\Blending Produções - Backup\Blending Produções - Tyrone Hirt - BC" /e /NJH /NDL /NC /BYTES /MT:4 /l /xd /A-:SH $IgnorarPastas /xf $IgnorarArquivos
Este comando listará todos os arquivos que devem ser copiados seguindo os parâmetros estabelecidos.
A questão é: eu gostaria de encontrar uma maneira de contar quantos arquivos serão copiados.
Para isso estou tentando uma abordagem de contar quantas correspondências "T:" existem na saída do robocopy, mas não estou obtendo o resultado esperado...
Este é o meu script completo:
$drv = "T:\"
$IgnorarPastas = "03. Proxy", "`$Recycle.Bin"
$IgnorarArquivos = "*.avi", "*.ini"
robocopy $drv "B:\Blending Produções - Backup\Blending Produções - Tyrone Hirt - BC" /e /NJH /NDL /NC /BYTES /MT:4 /l /xd /A-:SH $IgnorarPastas /xf $IgnorarArquivos
$robocopyCommand = "robocopy $drv ""B:\Blending Produções - Backup\Blending Produções - Tyrone Hirt - BC"" /e /NJH /NDL /NC /BYTES /MT:4 /l /xd /A-:SH $IgnorarPastas /xf $IgnorarArquivos"
$filesToCopy = Invoke-Expression $robocopyCommand
$numberOfFiles = ($filesToCopy | Select-String -Pattern "T:\\" -AllMatches).Matches.Count
write-host "`nNumber of files to be copied " -NoNewline -f White; write-host "$numberOfFiles" -NoNewline -f Green;
Esta é a saída do script no console:
$drv = "T:\"
$IgnorarPastas = "03. Proxy", "`$Recycle.Bin"
$IgnorarArquivos = "*.avi", "*.ini"
robocopy $drv "B:\Blending Produções - Backup\Blending Produções - Tyrone Hirt - BC" /e /NJH /NDL /NC /BYTES /MT:4 /l /xd /A-:SH $IgnorarPastas /xf $IgnorarArquivos
$comandoRobocopy = "robocopy $drv ""B:\Blending Produções - Backup\Blending Produções - Tyrone Hirt - BC"" /e /NJH /NDL /NC /BYTES /MT:4 /l /xd /A-:SH $IgnorarPastas /xf $IgnorarArquivos"
$robocopyCommand = "robocopy $drv ""B:\Blending Produções - Backup\Blending Produções - Tyrone Hirt - BC"" /e /NJH /NDL /NC /BYTES /MT:4 /l /xd /A-:SH $IgnorarPastas /xf $IgnorarArquivos"
$filesToCopy = Invoke-Expression $robocopyCommand
$numberOfFiles = ($filesToCopy | Select-String -Pattern "T:\\" -AllMatches).Matches.Count
write-host "`nNumber of files to be copied " -NoNewline -f White; write-host "$numberOfFiles" -NoNewline -f Green;
12680 T:\_Ferramenta Backup\Backup Local\_\BP - Backup Script - Root of this device - Get Backup.ps1
100%
379568522 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste Car\_Imagens\Drone\DJI_0001.MOV
2380021041 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste Car\_Imagens\Drone\DJI_0002.MOV
43588300 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste Car\_Imagens\Drone\DJI_0003.MOV
3335677673 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste Car\_Imagens\Drone\DJI_0004.MOV
2325513829 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste Car\_Imagens\Drone\DJI_0005.MOV
3245228768 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste Car\_Imagens\Drone\DJI_0006.MOV
1392290 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Fenauto 2023\Geral\_Pr\Adobe Premiere Pro Auto-Save\Fenauto Geral 1--aa12bd8f-a378-c373-6d52-62bab88e86a6-2023-12-04_11-36-34.prproj
1398658 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Fenauto 2023\Geral\_Pr\Adobe Premiere Pro Auto-Save\Fenauto Geral 1--aa12bd8f-a378-c373-6d52-62bab88e86a6-2023-12-04_12-12-44.prproj
54138464 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste\11. Novembro\07. Teste I Fenauto Overview Final\01. Fluxo\01. Ae\07-12-2023 Teste I Fenauto Overview Final (converted
).aep
84566896 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste\00. Identidade\01. Fluxo\01. Ae\Adobe After Effects Auto-Save\Teste I Identidade Audiovisual (converted) auto-
save 5.aep
230815274 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste\11. Novembro\17. DLPL Cast - EP 15\05. Render\Vertical\DLPL Cast I EP 14 I Corte 1 I Vert I Financiamento I Final - v
01.mp4
230450405 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste\11. Novembro\17. DLPL Cast - EP 15\05. Render\Vertical\DLPL Cast I EP 14 I Corte 2 I Vert I Consigna‡Æo I Final - v01
.mp4
12200 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste Car\12. Dezembro\29. TesteCar I Carros e Repasse\01. Fluxo\01. Ae\02-01-2024 Nome.aep
12200 136490 B:\Blending Produ‡äes - Backup\Blending Produ‡äes - Tyrone Hirt - BC\Blending Produ‡äes\02. Clientes\2023\Grupo Teste\Teste Car\12. Dezembro\29. TesteCar I Carros e Repasse\01. Fluxo\02. Pr\02-01-2024 Nome.prproj
------------------------------------------------------------------------------
Total Copiada IgnoradaIncompatibilidade FALHA Extras
Diret¢rios: 3407 3302 3406 0 1 6
Arquivos: 19705 1 19707 0 0 14
Bytes: 2037206266068 12680 2037651251411 0 0 12312508810
N.§ de Vezes: 0:00:00 0:00:00 0:00:00 0:00:00
Finalizado em: quinta-feira, 4 de janeiro de 2024 01:19:19
Number of files to be copied 169
Não estou conseguindo obter uma contagem correta desta forma, o resultado é 169 quando deveria ser 1, pois na saída apenas um arquivo está sendo copiado.
Como posso ajustar meu script para obter o resultado esperado?
Editar
Estou tentando outra abordagem:
# Find the line containing "Arquivos:"
$filesLine = $filesToCopy | Select-String -Pattern "Arquivos:.*?(\d+)\s+(\d+)" | ForEach-Object { $_.Matches }
# Extract the second group of numbers from the line
$numberOfFilesCopied = $filesLine.Groups[2].Value
Neste código, a expressão regular Arquivos:.*?(\d+)\s+(\d+)
é usada para procurar a linha que contém “Arquivos:” e capturar os dois grupos de números. O segundo grupo é então acessado usando $filesLine.Groups[2].Value
.
Ainda não consigo obter o resultado correto.
Resumindo, preciso contar quantos arquivos o robocopy copiará antes de iniciar a cópia.
Use apenas
($filesToCopy | Select-String -Pattern "T:\\").Count
na lógica omitindo as partes-AllMatches
e.Matches
para obter as contagens corretas que correspondem ao log do Robocopy armazenado em uma variável de matriz.Além disso, ao definir a
$robocopyCommand
variável, encapsule-a com aspas simples em vez de aspas duplas e remova os caracteres de escape de aspas duplas.PowerShell
Identifiquei dois problemas potenciais com seu script:
Invoke-Expression
, que geralmente é desencorajado, da mesma forma que funções de avaliação de código em outras linguagens de programação. Eu recomendaria evitá-lo por razões de segurança, o que provavelmente não importa aqui, mas vale a pena saber que quase sempre há substitutos melhores. Consulte a documentação para obter mais informações, por exemplo:Se você quiser executá-lo silenciosamente, basta substituir ambos:
com:
E
stdout
o stream será salvo na variável. Você pode então, por exemplo, silenciarstderr
o fluxo adicionando2>$null
no final, se necessário.