web-dev-qa-db-ja.com

%が区切り文字であるWindowsファイルの名前を一括変更するにはどうすればよいですか?

ファイル名に%が含まれているWindowsファイルがたくさんあります。下記参照:

c:\temp>
dir /b
114902_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1489879.pdf
114904_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1489880.pdf
114906_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491058.pdf
114916_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491059.pdf
114918_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491452.pdf
114920_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491453.pdf
114923_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491454.pdf
115513_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039292647.pdf
115515_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039295860.pdf
115517_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039296218.pdf
115523_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039308592.pdf
115525_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039308593.pdf
120342_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039328905.pdf
120345_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039337204.pdf
120348_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039337221.pdf
120351_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039337461.pdf
120639_T%3A%5CAccounting%5CPayables%5CAPA%5CAFA MAY 15%5CINV#63168731.pdf
120640_T%3A%5CAccounting%5CPayables%5CAPA%5CAFA MAY 15%5CINV#63168988.pdf
120642_T%3A%5CAccounting%5CPayables%5CAPA%5CAFA MAY 15%5CINV#63168993.pdf
120644_T%3A%5CAccounting%5CPayables%5CAPA%5CAFA MAY 15%5CINV#63169027.pdf

これらの%は、実際には:(%3A)および\(%5C)の16進コードです。別のシステムからコピーされたときにどのようにしてこのようになったかは説明できませんが、これは私が作業しなければならないことです。明確にするために、これは16進コードでどのように見えるかです。

114902_T:\Accounting\Payables\APA\Boshart Apr 25\BII_inv_1489879.pdf

私がしたいのは、これからファイルの名前を変更することです:

114902_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1489879.pdf

これに:

BII_inv_1489879.pdf

%を区切り文字として使用するように他の名前変更例を試してみましたが、さらに複雑なのは最後の区切り文字(pdfファイル名)が常に7番目のトークンであるとは限らないことです。

どんな助けも大いに実体化されるでしょう。

6
Steven Loretero

Windows 10を使用している場合は、Powershell管理および自動化用。とてもパワフルで、とても楽しいです。

あなたのサンプル名と望ましい結果で、私は '%5C'で分割し、-1のインデックスを使用して、長さに関係なく配列。

冗長:

$path = 'c:\temp'
Get-ChildItem $path | Rename-Item -NewName { ($_ -split '%5C')[-1] }

コンソールで:

gci c:\temp | ren -NewName { ($_ -split '%5C')[-1] }

Get-ChildItem

アイテム名の変更

分割について

文字列操作のデモ:

PS C:\...\keith>$oldnames
114902_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1489879.pdf
114904_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1489880.pdf
114906_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491058.pdf
114916_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491059.pdf
114918_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491452.pdf
114920_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491453.pdf
114923_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1491454.pdf
115513_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039292647.pdf
115515_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039295860.pdf
115517_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039296218.pdf
115523_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039308592.pdf
115525_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039308593.pdf
120342_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039328905.pdf
120345_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039337204.pdf
120348_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039337221.pdf
120351_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039337461.pdf
120639_T%3A%5CAccounting%5CPayables%5CAPA%5CAFA MAY 15%5CINV#63168731.pdf
120640_T%3A%5CAccounting%5CPayables%5CAPA%5CAFA MAY 15%5CINV#63168988.pdf
120642_T%3A%5CAccounting%5CPayables%5CAPA%5CAFA MAY 15%5CINV#63168993.pdf
120644_T%3A%5CAccounting%5CPayables%5CAPA%5CAFA MAY 15%5CINV#63169027.pdf
PS C:\...\keith>$oldnames | ForEach{ ($_ -split '%5C')[-1] }
BII_inv_1489879.pdf
BII_inv_1489880.pdf
BII_inv_1491058.pdf
BII_inv_1491059.pdf
BII_inv_1491452.pdf
BII_inv_1491453.pdf
BII_inv_1491454.pdf
0039292647.pdf
0039295860.pdf
0039296218.pdf
0039308592.pdf
0039308593.pdf
0039328905.pdf
0039337204.pdf
0039337221.pdf
0039337461.pdf
INV#63168731.pdf
INV#63168988.pdf
INV#63168993.pdf
INV#63169027.pdf
15
Keith Miller

ファイル名を反復処理して次のように書き直すPowerShellスクリプトを作成します。

$dir = Get-ChildItem -Path "PUTFULLPATHHERETODIRECTORY"
foreach($P in $dir) {
    Rename-Item -path $P -newname $P.FullName.Substring($P.FullName.lastindexof("%5C")+3)
}

まず、ターゲットフォルダーの内容を取得します。次に、ディレクトリ内の各アイテムについて、「%5C」パターンの最後のインデックスから始まる名前に名前を変更し、削除するために3つのスペースを追加します。

もちろん、フルパスを入れます[〜#〜] putfullpathheretodirectory [〜#〜]

7
Meow_ly

*5cを区切り文字として使用し、setコマンドを使用すると、トークン5、6、7などであるかどうかを心配することなく、ファイル名の最後の部分が取得されます。これは、常に最後の区切り文字の後に文字列を取得するためです...

Sponge Belly/DosTips.comによる区切り文字に基づいて文字列を部分文字列に分割

set "_trick=%_name:*5c=" & set "_name=%"

@echo off && setlocal enabledelayedexpansion

for %%i in (*.pdf)do call :_ren_: "%%~ni" && ren "%%~fi" "!_name!%%~xi"

:_ren_:
set "_name=%~1" <nul || endlocal && goto :EOF
set "_trick_=%_name:*5c=" & set "_name=%" && exit /b 
  • Powershellでも同じ
gci C:\temp|Ren -NewName {$_ -replace '.*%5C',''}

enter image description here

4
It Wasn't Me

%は区切り文字ですか?

次のバッチファイル(test.cmd)を使用します。

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims= " %%a in ('dir /b *.pdf') do (
  set _temp=%%c
  set _name=!_temp:~5!
  ren "%%a %%b %%c" !_name!
  )
endlocal

例:

F:\test>dir /b *.pdf
114902_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1489879.pdf
114904_T%3A%5CAccounting%5CPayables%5CAPA%5CBoshart Apr 25%5CBII_inv_1489880.pdf
115513_T%3A%5CAccounting%5CPayables%5CAPA%5CABB MAY 15%5C0039292647.pdf

F:\test>test
F:\test>dir /b *.pdf
BII_inv_1489879.pdf
BII_inv_1489880.pdf
0039292647.pdf

F:\test>

参考文献

3
DavidPostill

コマンドプロンプト(バッチ)ソリューションとバリアントを以下に示します。 (私は問題を、各%nnファイル名からlast.pdfシーケンス(を含む)を介してすべて削除し、ファイル名をその名前に変更することであると解釈します。)

@echo off
setlocal enabledelayedexpansion
for %%F in (*.pdf) do (
    set file=%%F
    call :process
)
goto :eof

:process
    set temp=%file%
    :find_all
    REM Remove everything through first %.
    set right=!temp:*%%=!
    REM If there's no change, there were no %'s.
    if not "%right%" == "%temp%" (
        REM Remove the two characters after the %.
        set temp=%right:~2%
        goto :find_all
    )
    if "%file%" == "%right%" (
        REM Filename didn't contain %.
        echo File %file% is unchanged.
    ) else if "%right:~4%" == "" (
        REM Name was abcd%5C.pdf (or abcd%.pdf), so there's nothing left.
        echo Nothing left after truncating %file%
    ) else if exist "%right%" (
        REM The "ren" command will give an error message for this,
        REM but it doesn't say the filename.
        echo Cannot rename %file% because %right% already exists.
    ) else (
        echo ren "%file%" "%right%"
    )
    goto :eof

全体的なアプローチは、各ファイル名を取得し、最初の%nnシーケンス(を含む)まですべてを削除し、それがなくなるまで繰り返します。いくつかのトリックが1つにまとめられています。

  • ファイル名を編集するには、%var:str1=str2%構文を使用します。
  • %var:*str1=str2%フォームを使用して、str1の最初の出現まで(含む)をすべて削除/置換します。
  • setlocal enabledelayedexpansionを使用しているのは、拡張の遅延が必要なためではありませんper、se、ですが、!var:str1=str2!を使用して置換できるため、%を使用できますstr1
  • いつものように、バッチファイルで%を使用する場合は、%%と入力する必要があります。

したがって、ステートメントset right=!temp:*%%=!は、最初の%の後(右側)のrightの一部にtempを設定します。これは、おそらく3Aまたは5Cで始まる文字列になります(これらは、ファイル名の例で%の後に表示される16進文字であるため)。次に、これら2つの文字を取り除き、結果をtempに割り当てます。

上記を実行し、出力を調べます。問題がなければ、echo renrenに変更して、実際にファイルの名前が変更されるようにします。


要件が、最後の%5Cではなく、最後の%nnまですべてを削除することである場合は、次のようにします。

@echo off
setlocal enabledelayedexpansion
for %%F in (*.pdf) do (
    set file=%%F
    call :process
)
goto :eof

:process
    set temp=%file%
    :find_all
    REM Remove everything through first %5C.
    set right=!temp:*%%5C=!
    REM If there's no change, there were no %5C's.
    if not "%right%" == "%temp%" (
        set temp=%right%
        goto :find_all
    )
    if "%file%" == "%right%" (
        REM Filename didn't contain %5C.
        echo File %file% is unchanged.
    ) else if "%right:~4%" == "" (
        REM Filename was abcdef%5C.pdf, so there's nothing left.
        echo Nothing left after truncating %file%
    ) else if exist "%right%" (
        REM The "ren" command will give an error message for this,
        REM but it doesn't say the filename.
        echo Cannot rename %file% because %right% already exists.
    ) else (
        echo ren "%file%" "%right%"
    )
    goto :eof

その他の注意事項:

  • これらはWindows 7でテストされています。
  • 原則として、これらはファイルを反復する単純なforループで行うことができます。しかし、forループを使用するとgotoループが壊れたため、2次ループをサブルーチンに移動する必要がありました。
  • 通常、情報を引数としてサブルーチンに渡します。しかし、ファイル名に%が含まれていると失敗しました。
  • これらのルーチンは、適度な量のエラーチェックを行います。
  • これらは、任意の数の%nn(または%5C)シーケンスを処理します。
  • これらは、最後の%nnシーケンスの後(つまり、新しいファイル名)を含む、任意の数のスペースを処理します。
2
Scott