2017-12-21 3 views
0

그래서 내가 좋아하는 나와 MSSQL 백업 한 무리의 이름을 변경하기 위해 노력하고있어 이름을 바꿉니다단일 라인은 파일 확인과 루프 파이프 및

 
DBName.bak 

처럼 뭔가에

 
DBName_backup_2017_12_20_564451321_567987465.bak 

을뿐만 아니라이 안전 확인을 통해 DBName.bak을 이미 복용 한 경우 DBName_1.bak을 수행 할 것입니다. 여기서 1은 사용되지 않는 유효한 파일 이름이있을 때까지 증분 변수입니다.

는 다음 코드와 함께 할 수 있었다 :

내가 지금 할 노력하고있어 무엇
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 
} 

, 배관과 한 줄을에, 그러나 운이없는입니다. 특히 Test-Path 수표를 사용하여 루프를 실행하십시오. 아무도 내가 이런 식으로 할 수있는 방법을 알고 있니? 간단한

답변

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} 

그것을 읽고 디버깅하기 위해 불필요하게 하드 코드를 만드는 때문에 일반적으로하지만,이 일을하지 않는 것이 좋습니다.

어느 쪽이든 이름 바꾸기가 원하는대로 작동하는지 확인한 후 치킨 스위치를 제거하십시오.

+0

> 데이터베이스 이름이 중복 된 파일의 번호를 다시 지정하기를 원할 경우 실제로는 한 줄로 표시 할 수 없습니다. 그건 내가 두려워했던거야. 글쎄, 적어도 나에게 테스트 경로와 파이프를하는 방법을 보여 주셔서 고마워요. –

관련 문제