1
resposta

Otimizar cmdlet Get-ChildItem PowerShell -Recurse

Tenho um script no powershell que busca o local de uma pasta conforme o nome do arquivo, porém, o cmdlet Get-ChildItem demora cerca de 10min/arq, precisaria otimizar esse tempo. Existe alguma clase dotNet, C# ou cmdlet que faça isso com mais rápidez?

$Inicio = "Iniciando..."
$Processando = "Processando..."
$Fim = "Finalizado..."

echo $Inicio

Get-Date

$Lista = Get-ChildItem -path C:\Users\gabriel.lima\Downloads\anexos\*.JPG #Carrega arquivos scaneados

$Lista.GetType()|Select-Object Name #Converte em lista para foreach

$Total = $Lista.Count

$Feito = 1
#Loop para cada elemento da lista
foreach ($element in $Lista) {

  echo "$Processando ... $Feito de $Total"

  $StringBuilder = New-Object System.Text.StringBuilder #cria objeto .net que trata strings

  $Documento = $element.name #carrega name do element

  $StringBuilder = $Documento #define o name no stringbuilder

  $Matricula = $StringBuilder.Replace(".jpg","") #tira o '.jpg' do name do documento

  #Trata prefixos dos arquivos - FIXO 
  if ($Matricula -match "Doc_Admissao") {
    $Matricula = $Matricula.Replace("Doc_Admissao","") 
  }
  if ($Matricula -match "Doc_Afastamentos") {
    $Matricula = $Matricula.Replace("Doc_Afastamentos_","") 
  } 
  if ($Matricula -match "Doc_Ferias"    ) {
    $Matricula = $Matricula.Replace("Doc_Ferias_","") 
  }
  if ($Matricula -match "Doc_Outros"    ) {
    $Matricula = $Matricula.Replace("Doc_Outros_","") 
  }
  if ($Matricula -match "Doc_Pensao"    ) {
    $Matricula = $Matricula.Replace("Doc_Pensao_","") 
  }
  if ($Matricula -match "Doc_Ponto"    ) {
    $Matricula = $Matricula.Replace("Doc_Ponto_","") 
  }
  if ($Matricula -match "Doc_Processos"    ) {
    $Matricula = $Matricula.Replace("Doc_Processos_","") 
  }
  if ($Matricula -match "Doc_Rescisao"    ) {
    $Matricula = $Matricula.Replace("Doc_Rescisao_","") 
  }

  #tira os possiveis espaços da matricula
  $Matricula = $Matricula.Replace(" ","")

  #Tratamento para o tipo de documento
  $TipoDoc = $StringBuilder.Replace($Matricula,"")
  $TipoDoc = $TipoDoc.Replace("_.jpg","")

  #Busca local da pasta do func
  $FullName = Get-ChildItem \\192.168.100.118\arquivos_senior\ArqInteg\Prontuario_Eletronico\ -Recurse | Where-Object Name -Match $Matricula

  $Pasta = $FullName.GetValue(0) 

  $FullName = $Pasta.FullName

  #$FullName = "\\192.168.100.118\arquivos_senior\ArqInteg\Prontuario_Eletronico\5142\"

  $LocArq = "$FullName\$TipoDoc" #monta local completo conforme matricula e tipdoc

  $ArqAtu = $element.FullName #carrega local do arquivo atual do foreach

  Copy-Item -Path $ArqAtu -Destination $LocArq -Force #copia o arquivo para o diretorio raiz

  $Feito = 1 + $Feito
}

echo $Fim

Get-Date
1 resposta

Olá Gabriel, como vai?

Sentimos muito pela demora em retornar.

Acredito que no curso C# Parte 9: Entrada e saída (I/O) com streams, você encontre uma solução para este problema.

Abraços e bons estudos!