Windows のファイル名から特殊文字を一括削除する

Windows のファイル名から特殊文字を一括削除する

私はバッチ スクリプトについてはまったくの初心者です。

これに関しては解決策がありますLinuxとmacOSただし、Windows では必要です。

次のようなものがありますが、これは !@#$%^&*~ などの特殊文字、つまり基本的にキーボードに表示される文字にのみ機能します。 しかし、Â や ° などの特殊文字を削除する必要があります。次のスクリプトは、これら 2 つの特定の文字では機能しません。、cmdで実行できるスクリプトです。これただし、Win7 cmd と互換性はありません。

@echo off &setlocal
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *#*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:#=!"
    ren "!fname!" "!nname!"
    endlocal
)

そして、ファイル名のスペースのみを削除できる次のもの

@echo off
setlocal disableDelayedExpansion
if /i "%~1"=="/R" (
  set "forOption=%~1 %2"
  set "inPath="
) else (
  set "forOption="
  if "%~1" neq "" (set "inPath=%~1\") else set "inPath="
)
for %forOption% %%F in ("%inPath%* *") do (
  if /i "%~f0" neq "%%~fF" (
    set "folder=%%~dpF"
    set "file=%%~nxF"
    setlocal enableDelayedExpansion
    echo ren "!folder!!file!" "!file: =!"
    ren "!folder!!file!" "!file: =!"
    endlocal
  )
)

答え1

スクリプトにコード ページ 437 を使用する必要があるという事実に対処すれば、最初のスクリプトは機能しました。

以下のスクリプトをメモ帳に貼り付けます。ANSI エンコードで test.bat として保存します。

@echo off &setlocal
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *ø*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:ø=!"
    ren "!fname!" "!nname!"
    endlocal
)

上記のスクリプトの名前degree°.txtは に変更されますdegree.txt

ø は Unicode なので使用されますU+00F8。度記号は0xF8コード ページ 437 にあります。

Âはコードページ437には表示されないので、並列ソリューションはわかりません。おそらく、この回答の指示に従ってコードページを変更します適切に実行します。コード ページの変更を含むバッチ ファイルの試みを次に示します。

echo Ignore the error displayed below
@echo off &setlocal
chcp 65001>nul
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *Â*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:Â=!"
    ren "!fname!" "!nname!"
    endlocal
)

上記をメモ帳ファイルに貼り付け、エンコードを UTF-8 にして保存します。バッチ ファイルは最初に UTF-8 ファイルを処理するときにエラーが発生するため、スクリプトの最初の行を含める必要があります。

答え2

これを自分の功績だと言いたいところですが、偶然見つけたものです。見つけた投稿が見つからないので、これは記憶からのものです。

find . -depth -name "*" -print0 | $var -0 sed -i 's/[:cntrl:]/_/g' *

少し試してみる必要があるかもしれません。私は自分のプロジェクトから数分を割いてこれを投稿しているだけです。結果をぜひ共有してください。

関連情報