Как я могу использовать 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
}