1

大家好,感谢您的帮助!

我目前有这个程序将单个文件重命名为小写:

这个文件是小写.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\"。一切正常,但它不会重命名包含 a 的文件所以一切正常,但它似乎无法重命名带有空格的文件,即使它在 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

您应该仔细阅读 FOR 帮助,通过键入HELP FORFOR /?从命令提示符访问。您将看到 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 也可以大大简化为一行。

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