Wie kann ich PowerShell verwenden, um Dateinamen zu analysieren und umzubenennen?

10484
dwwilson66

Ich habe ein Projekt, das Logfiles analysiert. Jemand benennt in seiner unendlichen Weisheit die Protokolldateien MM-DD-JJJJ-HH-MM.LOG (z. B. 10-31-2012-18-00.LOG für 31.30 Uhr am 31. Oktober 2012).

Meine erste Aufgabe ist es, etwas wesentlich vernünftigeres zu erstellen, indem ich Kopien der vorhandenen Protokolle namens YYYYMMDD_HHMM.LOG (z. B. 20121031_1800.LOG für das obige Beispiel) anfertige und dazu PowerShell verwenden muss.

Also hier bin ich soweit:

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

und ich bekomme immer einen Fehler

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

Ich weiß, dass mir hier etwas ziemlich Dummes fehlt ... Ich kann es einfach nicht sehen. Gibt es noch andere Augen, die mir helfen können?

4

1 Antwort auf die Frage

3
Ƭᴇcʜιᴇ007

Get-ChildItem gibt eine Liste von Dateisystemobjekten zurück, nicht nur Dateinamen.

Sie können die -NameOption verwenden, um nur Dateinamen zurückzugeben.

Der Ausgabetyp ist der Typ der Objekte, die das Cmdlet ausgibt.

System.Object - Der Objekttyp, den Get-ChildItem zurückgibt, wird von den Objekten im Provider-Laufwerkspfad bestimmt.

System.String - Wenn Sie den Parameter Name verwenden, gibt Get-ChildItem die Objektnamen als Zeichenfolgen zurück.

Etwas wie das:

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