ファイル名に%が含まれている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番目のトークンであるとは限らないことです。
どんな助けも大いに実体化されるでしょう。
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] }
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
ファイル名を反復処理して次のように書き直す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 [〜#〜]。
*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
gci C:\temp|Ren -NewName {$_ -replace '.*%5C',''}
%
は区切り文字ですか?次のバッチファイル(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>
コマンドプロンプト(バッチ)ソリューションとバリアントを以下に示します。 (私は問題を、各%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 ren
をren
に変更して、実際にファイルの名前が変更されるようにします。
要件が、最後の%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
その他の注意事項:
for
ループで行うことができます。しかし、for
ループを使用するとgoto
ループが壊れたため、2次ループをサブルーチンに移動する必要がありました。%
が含まれていると失敗しました。%nn
(または%5C
)シーケンスを処理します。%nn
シーケンスの後(つまり、新しいファイル名)を含む、任意の数のスペースを処理します。