1

みなさん、こんにちは。助けてくれてありがとう!

私は現在、単一のファイルの名前を小文字に変更するこのプログラムを持っています:

このファイルはLowercase.batです

set LC1=%~nx1
set LC1=%LC1:"=%
set LC1=%LC1:A=a%
set LC1=%LC1:B=b%
set LC1=%LC1:C=c%
set LC1=%LC1:D=d%
set LC1=%LC1:E=e%
set LC1=%LC1:F=f%
set LC1=%LC1:G=g%
set LC1=%LC1:H=h%
set LC1=%LC1:I=i%
set LC1=%LC1:J=j%
set LC1=%LC1:K=k%
set LC1=%LC1:L=l%
set LC1=%LC1:M=m%
set LC1=%LC1:N=n%
set LC1=%LC1:O=o%
set LC1=%LC1:P=p%
set LC1=%LC1:Q=q%
set LC1=%LC1:R=r%
set LC1=%LC1:S=s%
set LC1=%LC1:T=t%
set LC1=%LC1:U=u%
set LC1=%LC1:V=v%
set LC1=%LC1:W=w%
set LC1=%LC1:X=x%
set LC1=%LC1:Y=y%
set LC1=%LC1:Z=z%
ren "%1" "%LC1%"

そして、私はこのファイルを持っており、すべてのサブフォルダー内のすべてのファイルとフォルダーの名前を(おそらく)変更します。上記のバッチを複数回呼び出すことによってそれを行います

これはLowerCaseRecursive.batと呼ばれます

pushd %1
dir *.* /b /a-d /s > lwrcase.log
for /f %%i in ('type lwrcase.log') do call LowerCase "%%i"
del /q lwrcase.log
popd

コマンドラインを使用してプログラムを呼び出し、LowerCaseRecursive.bat "C:\Test\"と言います。すべてが正常に機能しますが、を含むファイルの名前は変更されません。したがって、すべてが正常に機能しますが、lwrcase.logにフルネームが含まれていても、スペースが含まれるファイルの名前を変更できないようです。forは、最初のスペースまで解析します。

私はWindowsのバッチプログラミングについてほとんど知識がありません、何かアイデアはありますか?

みなさん、ありがとうございました!これについて質問がある場合は、私に聞いてください。

編集:問題は、lowercase.batへの個々の呼び出しで発生する可能性が最も高いです。デバッグスペースを切り取った後、lowercase.batの呼び出しにはすでにファイル名全体が含まれていることがわかります。つまり、ファイルがC:\ Hello \ My File.txtの場合、次のように呼び出されます。

call Lowercase "C:\Hello\My"
4

2 に答える 2

3

試す

set LC1=%LC1:' '=''%

ちょっとしたトリックがうまくいくはずです。変換パターンに従って、space ' '行を追加するだけです

于 2013-01-14T14:18:07.460 に答える
1

HELP FOR入力またはFOR /?コマンド プロンプトからアクセスできる FOR ヘルプを注意深く読む必要があります。FOR /F が各行をトークンに解析し、デフォルトのトークン区切り文字がスペースとタブであることがわかります。

DELIMS を何も設定しないで、トークンの解析を無効にするだけです。技術的には、EOL をパスを開始できない文字に設定する必要もあります。デフォルトの EOL 文字は;. で始まる行はすべて;無視され、;フォルダ名とファイル名に有効です (非常にまれですが)。パスを で開始することはできない:ため、これは適切な選択です。

for /f "eol=: delims=" %%i in ('type lwrcase.log') do call LowerCase "%%i"

編集

ここにあなたのコードへの未承諾の改善があります :-)

Lowercase.bat ははるかに小さくすることができます。これは、検索と置換の検索部分が大文字と小文字を区別しないために機能します。

setlocal enableDelayedExpansion
set "LC1=%~nx1"
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 "LC1=!LC1:%%C=%%C!"
)
ren %1 "!LC1!"
exit /b

また、LowerCaseRecursive.bat も 1 行に大幅に簡略化できます。

for /r %1 %%F in (*) do call LowerCase "%%F"
于 2013-01-14T15:12:39.863 に答える