带文件检查和重命名的单行管道循环

时间:2017-12-21 22:57:14

标签: powershell

所以我试图重命名一堆MSSQL备份,如:

DBName_backup_2017_12_20_564451321_567987465.bak

这样的东西
DBName.bak

但也要进行安全检查,以确保如果已经DBName.bak已经采取DBName_1.bak 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 } 。其中1将是增量变量,直到存在有效的未使用文件名。

我能够使用以下代码完成:

Test-Path

我现在要做的是,用一条管道来一条线,但我没有运气。特别是使用app.post('/photos', upload.any(), function(solicitud, respuesta){ //console.log(solicitud.body); if(solicitud.body.password == "emmanuel_1234567"){ var data = { title: solicitud.body.title, description: solicitud.body.description, imageUrl: 'images/carousel/1.jpg' }; var fotos = new Fotos(data); console.log(solicitud.files); cloudinary.uploader.upload( solicitud.files.photo_image.path, function(result) { fotos.save(function(error){ console.log('Datos de fotografía guardados satisfactoriamente:'); console.log(fotos); respuesta.render('index'); }); }); }else{ respuesta.render('photos/new'); console.log('Contraseña incorrecta, por favor, intentelo nuevamente...'); } }); 检查来运行循环。有谁知道我怎么能这样呢?

1 个答案:

答案 0 :(得分:1)

简单:

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

如果您只想(重新)对具有重复数据库名称的文件进行编号,那么您无法真正对该文件进行单行处理。你需要这样的东西:

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
}

但是,在PowerShell中,您可以使用换行符和分号分隔语句,因此您仍然可以将上述所有内容合并为一行。像这样:

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}

我通常不建议这样做,因为它会使代码难以阅读和调试。

无论哪种方式,在验证重命名后,取出鸡肉开关都可以正常工作。