0

私は何千ものファイル名をクリーンアップしていますが、ほとんどは次のような構造になっています: "xxxx xxxx - xxxxx xxxx xxxx.yyy" 問題は、大文字で始まるものとそうでないものがあることです。(実際には他にも問題がありますが、簡単に修正できます。)

任意の文字の文字列を取り、ピリオドの前にあるすべての単語を大文字にしたいと思います。
FINDでできるように、ファイルを使用するのではなく、パイプを使用して1行のコードを使用することをお勧めします。
最後に、文字列全体を一度に大文字にすることを好みますが、各単語を個別に処理することに反対しているわけではありません。

例:

Input:  "this - string IS an EXAMPLE 4 u"
Output: "This - String IS An EXAMPLE 4 U"

大文字とアルファベット以外の文字 (ダッシュ、アンダースコア、数字など) をすべて無視し、影響を受けずに渡したいと思います。

したがって、次のようなコードを使用できるようにしたいと思います (2 行目が関連するものです)。

for /f "tokens=*" %%x in ('dir /b *.zzz') do ( 
    for /f "tokens=*" %%y in ('echo %%x ^| findstr /r "s/\s\w/\U$&/g;"') do (
        rename "%%x" "%%y" ))

可能であれば、次のようにコマンドラインでテストできるようにしたいと思います。

echo hello to you | findstr /r "s/\s\w/\U$&/g;"

私の問題は、上記の例では出力が得られないことです。

ご覧のとおり、正規表現の例を検索しましたが、findstr でプラグアンドプレイすることはできません。

ファイル拡張子を大文字にしたくないのですが、これは簡単に修正できるので、あまり気にしません。

sed、grep、またはその他のサードパーティ製ソフトウェアの提案はご遠慮ください。ただし、他の MS ベースのソリューション (Enterprise または Ultimate に付属するもの、または Microsoft からダウンロード可能なもの) を受け入れます。

前もって感謝します!

4

1 に答える 1

2

正規表現のFINDSTRサポートは非​​常に制限されいます。またはコマンドラインから入力HELP FINDSTRするFINDSTR /?と、私が何を意味するかがわかります。さらに悪いことに、サポートされている正規表現機能は非標準の方法で実装されています。WindowsFINDSTRコマンドの文書化されていない機能と制限は何ですか?をご覧ください。-正規表現の制限は、回答の下部に記載されています。最終的な結果は、FINDSTRがあなたのケースでは役に立たないということです(しゃれは意図されていません)。

PowerShellを使用してやりたいことを行うのはかなり簡単なはずですが、私はまだその言語を学んでいません。VBScriptまたはJScriptを使用することもできます。3つすべてが強力な正規表現をサポートしています。

正規表現を使用せずにバッチソリューションを実装することは難しくありません。

%%Fファイル名(おそらくパス情報を含む)を含むFOR変数がある場合は%%~nF、拡張子なしでファイルの名前だけが表示されます。%%~xFファイルの拡張子が表示されます。完全HELP FORなドキュメントを取得するには、コマンドラインから入力してください。

文字列を大文字に変換する組み込みコマンドはありませんが、別のFORループを使用して実装するのは簡単です。SETコマンドは検索と置換をサポートし、検索部分では大文字と小文字が区別されません。したがって、各文字を検索して置き換えるだけです。

編集
要求されたとおりに各単語の最初の文字のみを大文字にするようにコードを修正しました。このコードは、スペースを単語の境界としてのみ認識します。単語境界としてサポートする文字ごとに、検索を追加してopを置き換える必要があります。

@echo off
setlocal enableDelayedExpansion
for %%F in (*.yyy) do (
  set "name= %%~nF"
  for %%C in (
    A B C D E F G H I J K L M
    N O P Q R S T U V W X Y Z
  ) do set "name=!name: %%C= %%C!"
  set "name=!name:~1!"
  echo ren "%%F" "!name!%%~xF"
)

!上記は、1つの潜在的な問題を除いて、うまく機能します。拡張時に遅延拡張が有効になっているため、文字を含むファイル名が破損します%%F。修正は、ループ内で遅延拡張のオンとオフを切り替えることです。

@echo off
setlocal disableDelayedExpansion
for %%F in (*.yyy) do (
  set "original=%%F"
  set "name= %%~nF"
  set "ext=%%~xF"
  setlocal enableDelayedExpansion
  for %%C in (
    A B C D E F G H I J K L M
    N O P Q R S T U V W X Y Z
  ) do set "name=!name: %%C= %%C!"
  set "name=!name:~1!"
  echo ren "!original!" "!name!!ext!"
  endlocal
)

上記の両方のスクリプトは、実行される名前変更コマンドを単にエコーします。RENの前にあるECHOを削除するだけで、スクリプトによって実際にファイルの名前が変更されます。

于 2012-07-17T12:00:47.020 に答える