Как я могу использовать PowerShell для разбора имен файлов и их переименования?

У меня есть проект, анализирующий лог-файлы. Кто-то в своей бесконечной мудрости называет лог-файлы MM-DD-YYYY-HH-MM.LOG (например, 10-31-2012-18-00.LOG на 18:00 31 октября 2012 г.).

Мой первый заказ - создать что-то более разумное для работы, создав копии существующих журналов с именем YYYYMMDD_HHMM.LOG (например, 20121031_1800.LOG для приведенного выше примера), и для выполнения этой задачи необходимо использовать powershell.

Так вот, где я так далеко:

$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"
}

и я продолжаю получать ошибку

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

Я знаю, что мне здесь не хватает чего-то довольно глупого... Я просто не вижу этого. Есть какие-то другие глаза, которые могут мне помочь?

1 ответ

Get-ChildItem возвращает список объектов файловой системы, а не только имена файлов.

Вы можете использовать -Name возможность получить только имена файлов.

Тип вывода - это тип объектов, которые выдает командлет.

System.Object - тип объекта, который возвращает Get-ChildItem, определяется объектами в пути диска провайдера.

System.String - если вы используете параметр Name, Get-ChildItem возвращает имена объектов в виде строк.

Что-то вроде этого:

$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
}
Другие вопросы по тегам