2017-12-21 4 views
0

Also ich versuche, eine Reihe von MSSQL Backups umbenennen, die wie kommen:Einzeiliger verrohrt Schleife mit File Check und Umbenennen

 
DBName_backup_2017_12_20_564451321_567987465.bak 

zu etwas wie

 
DBName.bak 

Aber auch eine haben Sicherheitsüberprüfung, um sicherzustellen, dass, wenn DBName.bak bereits vergeben ist, DBName_1.bak. Wobei 1 eine inkrementelle Variable ist, bis ein gültiger nicht verwendeter Dateiname existiert.

Ich konnte es mit dem folgenden Code tun:

Get-ChildItem *_*.bak | % { 
    # Set the new name, replace everything after the first underscore '_' with 
    # '.bak' 
    $newName = &{$_.Name -replace $_.Name.Substring($_.Name.IndexOf("_")), '.bak'} 

    # Check if new name exists 
    for ($cnt = 1; (Test-Path $newName) -eq $true; $cnt++) { 
     # If it already exists add '_' and a number check again until unused 
     # filename is found 
     $newName = &{$newName -replace '.bak', "_$cnt.bak"} 
    } 

    # Rename file to new filename. Uncomment WhatIf for testing. 
    Rename-Item -Path $_ -NewName $newName #-WhatIf 
} 

Was ich versuche jetzt zu tun ist, um eine Zeile ist es mit Rohrleitungen, aber kein Glück habe. Insbesondere die Schleife mit dem Test-Path überprüfen zu überprüfen. Weiß jemand wie ich das könnte?

Antwort

1

Ganz einfach:

$cnt = 0; Get-ChildItem *_*.bak | Rename-Item -NewName { 
    ($_.BaseName -replace '_.*', '_') + $script:cnt++ + $_.Extension 
} -WhatIf 

Wenn Sie nur wollen, (re) Anzahl Dateien mit doppelten Datenbanknamen können Sie nicht wirklich einzeilige die Sache. Sie brauchen etwas wie folgt aus:

Get-ChildItem *_*.bak | ForEach-Object { 
    $basename = $_.BaseName -replace '_.*' 
    $newname = $basename + $_.Extension 
    $script:cnt = 1 
    while (Test-Path $newname) { 
     $newname = $basename + '_' + $script:cnt++ + $_.Extension 
    } 
    Rename-Item -NewName $newname -WhatIf 
} 

jedoch in Powershell können Sie Anweisungen trennen beide mit Zeilenumbrüche und Semikolons, so können Sie immer noch alle oben in einer Zeile zusammenführen. Wie folgt aus:

Get-ChildItem *_*.bak | ForEach-Object {$basename = $_.BaseName -replace '_.*'; $newname = $basename + $_.Extension; $script:cnt = 1; while (Test-Path $newname) {$newname = $basename + '_' + $script:cnt++ + $_.Extension}; Rename-Item -NewName $newname -WhatIf} 

ich normalerweise nicht empfehlen dies zu tun, aber, weil es Code macht unnötig schwer und debuggen zu lesen.

Wie auch immer, entfernen Sie den Hühnchen-Schalter, nachdem Sie überprüft haben, dass das Umbenennen wie gewünscht funktionieren würde.

+0

> Wenn Sie nur Dateien mit doppelten Datenbanknamen (re) nummerieren möchten, können Sie das Ding nicht wirklich einzeilen. Das war, wovor ich Angst hatte. Na gut, danke, dass du mir gezeigt hast, wie man die While mit dem Test-Pfad verbindet. –