使文件夹和子文件夹中的所有文件夹都小写

时间:2017-03-02 21:33:53

标签: powershell batch-file cmd

有没有办法通过CMD或PowerShell做到这一点?我不想小写文件。只是foldernames。

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"

FOR /f "delims=" %%a IN (
 'dir /b/s /ad "%sourcedir%\*" '
 ) DO (
 FOR /f "delims=" %%m IN (
  'dir /b /L /ad "%%~dpa" '
  ) DO (
  IF /i "%%~nxa" equ "%%~nxm" IF "%%~nxa" neq "%%~nxm" ECHO(ren "%%a" "%%~nxm"
 )
)

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO(REN更改为REN以实际重命名文件。

以基本形式对目录名执行目录扫描。使用%%a中的目录,扫描%%~dpa中的父目录,获取小写(/L)基本格式的名称。

如果名称+扩展名在不区分大小写的模式下匹配但不是直接比较,则名称不是小写,因此重命名。

鉴于评论,

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"

IF "%sourcedir%"=="." SET "sourcedir=%cd%"
:genrnddir
SET /a tempdir=%RANDOM%
IF EXIST %tempdir% GOTO genrnddir
MD "%tempdir%"&PUSHD "%tempdir%"

FOR /f "delims=" %%a IN (
 'dir /b/s /ad "%sourcedir%\*" '
 ) DO (
 FOR /f "delims=" %%m IN (
  'dir /b /l /ad "%%~dpa" '
  ) DO (
  IF /i "%%~nxa" equ "%%~nxm" IF "%%~nxa" neq "%%~nxm" ECHO(ren "%%a" "%%~nxm"
 )
)
POPD
RD "%tempdir%"

GOTO :EOF

如果sourcedir指定为&#34,请将componentDidMount设置为当前目录名;

;

创建并更改为临时目录

执行原始程序,当前目录为空,因此"如果在当前目录中#34;问题是避免的。

返回原始目录并清理。

答案 1 :(得分:1)

您可以使用JREN.BAT - A regular expression renaming utility。 JREN.BAT是纯脚本(混合批处理/ JScript),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方exe文件。

此任务甚至不需要正则表达式功能,/L选项会将文件或文件夹名称转换为小写。所以find替换字符串可以简单地为空字符串。如果搜索使用了开始行锚"^",我认为它会稍快一些。

以下行将递归地将当前目录中的所有文件夹重命名为小写:

jren "^" "" /s /d /l

如果要重命名其他文件夹中的文件夹,只需添加/P选项即可。

jren "^" "" /s /d /l /p "c:\yourRootPath"

由于JREN本身就是一个批处理脚本,如果将命令放在另一个批处理脚本中,则必须使用CALL JREN

Magoo有一个纯粹的批处理脚本,大部分都可以使用,但它不像目前编写的那样可靠。问题是如果当前目录中存在具有相同名称(忽略大小写)的文件或文件夹,%%~nxm中的修饰符将恢复为磁盘上的当前大小写。可以使用%%m代替%%~nxm修复该错误。

但是脚本效率也很低,因为它迭代了笛卡尔积 - 如果文件夹A中有5个文件夹,则5个文件夹被迭代5次。

以下是我编写纯批处理解决方案的方法:

@echo off
for /d /r "rootPath" %%A in (.) do (
  for /f "eol=: delims=" %%B in ('dir /b /ad /l "%%A"') do (
    ren "%%A\%%B" "%%B"
  )
)

以上将重命名所有文件夹,即使是那些已经小写的文件夹。但是,将文件夹重命名为自身应该不会有问题。

如果您真的只想使用纯批处理重命名包含至少一个大写字符的文件夹,那么我将使用以下内容:

@echo off
for /d /r "rootPath" %%A in (*) do (
  for /f "eol=: delims=" %%B in ('dir /b /ad /l "%%A?"') do (
    if /i "%%~nxA" equ "%%B" if "%%~nxA" neq "%%B" echo ren "%%A" "%%B"
  )
)

第二个FOR循环中DIR命令中的?非常重要 - 通配符可确保列出正确的文件夹,并且列出其他不需要的文件夹的可能性很小。由于可能会列出多个文件夹,因此需要使用不区分大小写的IF语句来确保重命名正确的文件夹。