PowerShell의 일련 이름 바꾸기

16374 단어 WindowsPowerShell
파이프 된 파일/폴더에 일련 번호를 흔드는 cmdlet입니다. 이전 기사 똑같이 -execute 옵션 지정시만 리네임을 실행하도록 해 오조작에 대한 안전성을 높이고 있습니다.

환경


Name                           Value
----                           -----
PSVersion                      7.0.3
PSEdition                      Core
GitCommitId                    7.0.3
OS                             Microsoft Windows 10.0.18362
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

동작 이미지



맨 위에 추가





맨 위에 추가 & 파일 이름 통합





끝에 추가





끝에 추가 & 파일 이름 통일





기타 옵션





그 외에도 파라미터로 다음을 지정할 수 있습니다.
  • 일련 번호를 몇 개부터 시작할까
  • 몇 번씩 연속 번호를 흔들까
  • 일련 번호를 몇 자리로 0으로 채울 것인가

  • 코드


    function Rename-Index {
        <#
            .SYNOPSIS
            連番リネーム
            .DESCRIPTION
            パイプライン経由での入力にのみ対応(出力なし)
            .PARAMETER basename
            拡張子を覗いた部分のファイル/フォルダ名
            .PARAMETER start
            連番の開始番号
            .PARAMETER pad
            インデックスの桁数
            .PARAMETER execute
            指定した場合のみリネーム
            .PARAMETER step
            連番の増分
            .PARAMETER tail
            指定時はファイル名末尾に挿入
            .EXAMPLE
            ls * | Rename-Index
        #>
        param (
            [string]$basename,
            [int]$start = 1,
            [int]$pad = 2,
            [int]$step = 1,
            [switch]$tail,
            [switch]$execute
        )
    
        $proc = $input | Where-Object {$_.GetType().Name -in @("FileInfo", "DirectoryInfo")}
    
        $shiftJIS = [System.Text.Encoding]::GetEncoding("Shift_JIS")
        if ($basename) {
            $longestName = $proc.Name | Sort-Object {$shiftJIS.GetByteCount($_)} -Descending | Select-Object -First 1
            $fill = $shiftJIS.GetByteCount($longestName) + 1
        }
    
        $ANSI_BlackOnGreen = "`e[42m`e[30m"
        $ANSI_BlackOnWhite = "`e[47m`e[30m"
        $ANSI_Reset = "`e[0m"
        $bgColor = ($execute)? $ANSI_BlackOnGreen : $ANSI_BlackOnWhite
    
        $start -= $step
        $proc | ForEach-Object {
            $start += $step
            $index = "{0:d$($pad)}" -f $start
            $fileName = $_.Name
            if ($basename) {
                Write-Host $fileName -ForegroundColor DarkGray -NoNewline
                $leftIndent = $shiftJIS.GetByteCount($fileName)
                " {0}=> " -f ("=" * ($fill - $leftIndent)) | Write-Host -NoNewline
    
                $nameParts = ($tail)?
                    @($basename, $index, $_.Extension):
                    @("", $index, ($basename + $_.Extension))
            }
            else {
                $nameParts = ($tail)?
                    @($_.Basename, "_$($index)", $_.Extension):
                    @("", "$($index)_", $fileName)
            }
            "{0}$($bgColor){1}$($ANSI_Reset){2}" -f $nameParts | Write-Host
    
            if (-not $execute) {
                return
            }
    
            $renamedName = $nameParts -join ""
    
            try {
                $_ | Rename-Item -NewName $renamedName -ErrorAction Stop
            }
            catch {
                Write-Host ("ERROR: failed to rename '{0}' to '{1}'!" -f $fileName, $renamedName) -ForegroundColor Magenta
                (Test-Path $renamedName)?
                    "(same name exists in directory)":
                    "(other process may opening file)" | Write-Host -ForegroundColor Magenta
            }
    
        }
    }
    

    PowerShell 7에서 삼항 연산자와 이스케이프 시퀀스 `e

    좋은 웹페이지 즐겨찾기