Powershell 将文件夹和子文件夹中的所有文件夹设置为小写

Powershell 将文件夹和子文件夹中的所有文件夹设置为小写,powershell,batch-file,cmd,Powershell,Batch File,Cmd,有没有办法通过CMD或powershell实现这一点?我不想把这些文件小写。只有文件夹名。@ECHO OFF SETLOCAL 设置“sourcedir=U:\sourcedir” 对于/f“delims=”%%a IN( 'dir/b/s/ad”%sourcedir%\*“' )做( 对于/f“delims=“%%m IN( 'dir/b/L/ad“%%~dpa”' )做( IF/i“%%~nxa”eq“%%~nxm”IF“%%~nxa”neq“%%~nxm”ECHO(ren“%%%a”“%%

有没有办法通过CMD或powershell实现这一点?我不想把这些文件小写。只有文件夹名。

@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于/f“delims=”%%a IN(
'dir/b/s/ad”%sourcedir%\*“'
)做(
对于/f“delims=“%%m IN(
'dir/b/L/ad“%%~dpa”'
)做(
IF/i“%%~nxa”eq“%%~nxm”IF“%%~nxa”neq“%%~nxm”ECHO(ren“%%%a”“%%~nxm”
)
)
后藤:EOF
您需要更改
sourcedir
的设置以适应您的环境

所需的REN命令仅用于测试目的。
ECHO
ed。验证命令正确后,将
ECHO(REN
更改为
REN
以实际重命名文件

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

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


评论说,

@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
如果“%sourcedir%”==”,则设置“sourcedir=%cd%”
:genrnddir
设置/a tempdir=%RANDOM%
如果存在%tempdir%GOTO genrnddir
MD“%tempdir%”和PUSHD“%tempdir%”
对于/f“delims=”%%a IN(
'dir/b/s/ad”%sourcedir%\*“'
)做(
对于/f“delims=“%%m IN(
'dir/b/l/ad“%%~dpa”'
)做(
IF/i“%%~nxa”eq“%%~nxm”IF“%%~nxa”neq“%%~nxm”ECHO(ren“%%%a”“%%~nxm”
)
)
流行音乐
RD“%tempdir%”
后藤:EOF
如果指定为“here”,则将
sourcedir
设置为当前目录名

创建并更改为临时目录

执行原始过程,其中当前目录为空,因此避免了“if in current directory”问题

返回原始目录并清理。

您可以使用.JREN.BAT是纯脚本(混合批处理/JScript),从XP开始在任何Windows计算机上本机运行-无需第三方exe文件

此任务甚至不需要正则表达式功能,
/L
选项将文件或文件夹名称转换为小写。因此,“查找替换字符串”可以是空字符串。我认为如果搜索使用起始行定位点
“^”
,速度会稍快一些

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

jren "^" "" /s /d /l
如果要重命名其他文件夹中的文件夹,只需添加
/p
选项即可

jren "^" "" /s /d /l /p "c:\yourRootPath"
由于JREN本身就是一个批处理脚本,如果将命令放在另一个批处理脚本中,则必须使用
调用JREN

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

但是脚本的效率也很低,因为它迭代笛卡尔积-如果文件夹a中有5个文件夹,那么这5个文件夹将迭代5次

下面是我将如何编写纯批处理解决方案:

@echo关闭
对于(.)do中的/d/r“根路径”%%A(
对于/f“eol=:delims=“%%B in('dir/B/ad/l“%%A”)do(
ren“%%A\%%B”“%%B”
)
)
上面的操作将重命名所有文件夹,甚至是那些已经小写的文件夹。但是,将文件夹重命名为自身并不成问题

如果确实希望使用纯批处理仅重命名至少包含一个大写字符的文件夹,则我将使用以下方法:

@echo关闭
对于(*)do中的/d/r“根路径”%%A(
对于/f“eol=:delims=“%%B in('dir/B/ad/l“%%A?”)do(
if/i“%%~nxA”eq“%%B”if“%%~nxA”neq“%%B”echo ren“%%A”“%%B”
)
)

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

您尝试了什么?要显示任何代码吗?如果您想要batch/powershell,您应该应用相关标记。并搜索查找()。实际上,您应该能够在第一个FOR命令中使用/L选项,而不用第二个FOR命令,直接转到重命名。如果目录已以大写形式命名,则在发出重命名命令时,重命名命令不关心文件夹名称是大写还是小写。如果是大写,则执行
向上重命名per
它处理得很好。因此,基本上可以重命名它,而不管它是高还是低。@Squashman:考虑得好。不幸的是,它不起作用。
对于/f“delims=“%%a IN('dir/b/s/L/ad”%sourcedir%\*“')DO ECHO(ren“%%a”“%%nxa”
-可以在一行上-在我的计算机(Win10)上的CaMeLcAsE中显示具有目标名称的重命名。如果在
“%%~a”或
“%%~nxa”上使用
for/f
,则相同
-大写字符仍然存在…是的,这让我很惊讶。这是个好主意,但很抱歉-那艘小船上有一个小洞…非常奇怪,因为我昨晚在发布我的评论之前在Windows 10上对它进行了测试。@Squashman-需要两个循环,因为单个循环将在
%%a
内具有完整路径,所以
%%~nxa
将恢复到原来的大小写形式-来自
DIR/L
的小写效果将丢失。@Magoo-如果任何
%%~nxm
与当前目录中的文件或文件夹名匹配,则使用
%%nxa
会导致出现错误。请参阅我的答案。