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

Powershell 带文件检查和重命名的单线管道循环,powershell,Powershell,因此,我尝试重命名一组MSSQL备份,结果如下: DBName_backup_2017_12_20_564451321_567987465.bak 我现在想做的是,把它和管道连接起来,但是我没有运气。特别是让循环与测试路径检查一起运行。有人知道我怎么会这样吗?很简单: $cnt = 0; Get-ChildItem *_*.bak | Rename-Item -NewName { ($_.BaseName -replace '_.*', '_') + $script:cnt++ + $_

因此,我尝试重命名一组MSSQL备份,结果如下:

DBName_backup_2017_12_20_564451321_567987465.bak 我现在想做的是,把它和管道连接起来,但是我没有运气。特别是让循环与测试路径检查一起运行。有人知道我怎么会这样吗?

很简单:

$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}
不过,我通常不建议这样做,因为这会使代码不必要地难以阅读和调试


无论哪种方式,在验证重命名是否可以按需要工作后,请删除“鸡肉”开关。

>如果您只想用重复的数据库名称对文件重新编号,则无法真正将其一行删除。这就是我害怕的。当然,感谢您至少向我展示了如何使用测试路径进行管道连接。
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
}
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}