2017-12-17 3 views
1

Während ich weiß, wie ich das in PHP machen würde, macht es keinen Sinn, IIS zu installieren, PHP zu installieren, nur um das zu erledigen.Wie werden mehrere Dateien mit der vorhandenen Unix-Zeit im Dateinamen umbenannt?

Ich habe einen Ordner D:\Data, der mehrere Unterordner enthält. Diese Ordner enthalten Dateien, bei denen es sich um Sicherungen handelt, die mit einem Programm erstellt wurden, das dem Namen einen Zeitstempel hinzufügt, um mehrere Kopien der zu sichernden Datei zu ermöglichen.

müssen diese Dateien benannt werden:

usera.dat 

Aber sie sind zur Zeit genannt:

usera.dat.17383947323.dat 

In PHP, würde ich den Namen der Datei in einen String laden, explodieren die Zeichenfolge auf“. ", dann benennen Sie die Datei mit den Elementen [0] und [3] um, um die Datei umzubenennen, dh ohne die Schleife, um die Verzeichnisse zu lesen:

$filename = $existing_file 
$explodename = explode(".",$filename); 
$newfilename = $explodename[0] . "." . $explodename[3]; 
rename($filename, $newfilename); 

Hat jemand eine Empfehlung, wie man dies mit PowerShell oder einer Batch-Datei macht, die über alle Unterordner in D:\Data läuft?

Momentan bearbeite ich jede Datei manuell und entferne die extra Unix Zeit stamp.dat Teil.

Antwort

1

One-Liner in Charge aus der Aufforderung:

@FOR /r "U:\sourcedir" %a IN (*) DO @FOR %b IN ("%~na") DO @FOR %c IN ("%~nb") DO @IF "%~xc" neq "" ECHO REN "%a" "%~nxc" 

Hinweis: echo ES den Umbenennungs Befehl zum Testen. Entfernen Sie nach dem Testen das Schlüsselwort echo, um das Umbenennen auszuführen.

Ich verwendete u:\sourcedir als Testverzeichnis.

Übersetzung: für jeden Dateinamen in der Teilstruktur (%%a) nehmen Sie den Namensteil für %%c-%%b, wiederholen Sie nur an und ordnen und wenn kein Erweiterungsteil im Ergebnis ist, dann tut die Umbenennungs.

+0

Danke. Dies war am einfachsten zu implementieren und funktionierte erstaunlich. Genau das, wonach ich gesucht habe. – Teeoney

2

Übersetzen dies von PHP zu Powershell sollte ein Kinderspiel sein, lassen Sie uns, es zu versuchen:

$files = Get-ChildItem -Filter *.dat.*.dat 

foreach($file in $files){ 
    $filename = $file.Name 
    $explodename = $filename.Split('.') 
    $newfilename = "$($explodename[0]).$($explodename[3])" 
    Rename-Item $file.FullName -NewName $newfilename 
} 

Wie oben gezeigt:

  • Powershell keine explode() Funktion hat, aber wir können verwenden Die String.Split() Methode für eine beliebige Zeichenfolge und ein Zeichenfolgenarray zurück
  • . ist kein String-Concat-Operator in PowerShell, aber wir können Teilausdrücke $(...) innerhalb verwenden eine erweiterbare Zeichenfolge.
  • Das Rename-Item Cmdlets kümmern

Eine Powershell-idiomatische Lösung obwohl die Pipeline zu nutzen, wäre die Umbenennung:

Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$explodename = $_.Name.Split('.');"$($explodename[0]).$($explodename[3])"} 

Sie auch ein RegexMuster anstelle verwenden könnte der Split() Methode und String-Verkettung:

Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$_.Name -replace '^([^\.])\..*\..*\.([^\.])$','$1.$2'} 

Oder die Verkettung mit dem -join Operator tun:

Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$_.Name.Split('.')[0,3] -join '.'} 

Was auch immer Sie Lust, Get-ChildItem und Rename-Item auf jeden Fall die Befehle sind Sie hier

0

Mathias R. Jessen's answer viele hilfreiche Hinweise verwenden enthält wollen würde, aber es scheint, dass Der einfachere und robustere Ansatz wäre, einfach die Endgültigen 2 Erweiterungen fallen zu lassen, unter der Annahme, dass alle Dateien im Ordnerbaum diese 2 externen Erweiterungen haben:

Verwandte Themen