Como posso usar o PowerShell para analisar nomes de arquivos e renomeá-los?

4

Eu tenho um projeto analisando arquivos de log. Alguém, em sua infinita sabedoria, está nomeando os arquivos de registro MM-DD-AAAA-HH-MM.LOG (por exemplo, 10-31-2012-18-00.LOG para 18:00 em 31 de outubro de 2012).

Minha primeira tarefa é criar algo significativamente mais razoável para trabalhar, fazendo cópias dos registros existentes chamados YYYYMMDD_HHMM.LOG (por exemplo, 20121031_1800.LOG para o exemplo acima) e deve usar o powershell para realizar essa tarefa.

Então aqui é onde eu estou até agora:

$orgPath = "d:\testOrg\"
$newPath = "d:\testNew\"
$delim   = "-" ;

function copyFile {
"$($orgPath) copying Files to $($newPath)" 
Get-ChildItem $orgPath | '
foreach { 
  $nameArray = $_.Split($delim)
  $newName = Write-Output $nameArray[2]+$nameArray[0]+$nameArray[1]+"_"+$nameArray[3]+$nameArray[4] 
  $targetFile = $newPath + $_.FullName.SubString($orgPath.Length) 
  New-Item -ItemType File -Path $targetFile -Force  
  Copy-Item $_.FullName -destination $targetFile
  write-host $_.DirectoryName $_.newName  
  "File Copied"
}

e eu continuo recebendo um erro

+ CategoryInfo          : InvalidOperation: (Split:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Eu sei que estou sentindo falta de algo muito estúpido aqui ... Eu simplesmente não consigo ver. Quaisquer outros conjuntos de olhos que possam me ajudar?

    
por dwwilson66 28.09.2014 / 22:11

1 resposta

3

Get-ChildItem retorna uma lista de objetos do sistema de arquivos, não apenas nomes de arquivos.

Você pode usar a opção -Name para fazer com que retorne apenas nomes de arquivos.

The output type is the type of the objects that the cmdlet emits.

System.Object - The type of object that Get-ChildItem returns is determined by the objects in the provider drive path.

System.String - If you use the Name parameter, Get-ChildItem returns the object names as strings.

Algo parecido com isto:

$orgPath = "d:\testOrg\"
$delim = "-"

Get-ChildItem $orgPath -Name | '
foreach { 
  $nameArray = $_.Split($delim)
  $newName = $nameArray[2]+$nameArray[0]+$nameArray[1]+"_"+$nameArray[3]+$nameArray[4] 
  Write-Output $newName
}
    
por 28.09.2014 / 22:49