Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows批处理文件-对于给定目录和子目录中的所有文件-将文件扩展名更改为小写_Windows_Batch File - Fatal编程技术网

Windows批处理文件-对于给定目录和子目录中的所有文件-将文件扩展名更改为小写

Windows批处理文件-对于给定目录和子目录中的所有文件-将文件扩展名更改为小写,windows,batch-file,Windows,Batch File,我的目标:使用Windows批处理脚本确保给定目录和子目录中的所有文件都具有小写文件扩展名 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 "ext=!ext:%%C=%%C!" 我已经成功地走到了这一步(我承认不是很远!) 这将成功打印出具有扩展名(inc full path)的所有文件,但如何检查文件扩展名并确保它是小写的(顺便说一句,我不想将文件名设置为小写..只是扩展名) 提前谢谢 格雷格这

我的目标:使用Windows批处理脚本确保给定目录和子目录中的所有文件都具有小写文件扩展名

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 "ext=!ext:%%C=%%C!"
我已经成功地走到了这一步(我承认不是很远!)

这将成功打印出具有扩展名(inc full path)的所有文件,但如何检查文件扩展名并确保它是小写的(顺便说一句,我不想将文件名设置为小写..只是扩展名)

提前谢谢


格雷格

这很匆忙,但需要处理一些事情

for /r C:\Folder %%a in (*) do (
    for /f %%s in ('dir /b /l %%a') do (
        ren %%a %%~na%%~xs
    )
)
带有
/l
开关的
dir
命令将其转换为小写,但从测试结果来看,我所做的测试表明,它有时有效,有时无效

希望其他成员能够改进此功能,但从理论上讲,它应该是可行的。

完成任务需要2种(可能3种)技巧

1) 您需要解析出文件名和文件扩展名-这与“帮助”部分中所述的内容非常简单。(从命令行键入有关的帮助)

  • %%~nG
    =文件名
  • %%~xG
    =文件扩展名
2) 您需要将每个文件扩展名存储在一个变量中,然后使用如下代码将其转换为小写

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 "ext=!ext:%%C=%%C!"
您需要使用脚本顶部的
setlocal enableDelayedExpansion
启用延迟扩展

上述方法之所以有效,是因为搜索和替换的搜索部分不区分大小写

3) 在不太可能的情况下,文件扩展名可能包含
,您需要在循环中打开和关闭延迟扩展。但我很怀疑你会遇到那种情况

这是一个完成的、运行良好的脚本,它忽略了第3点

@echo off
setlocal enableDelayedExpansion
for /r "c:\test" %%F in (*) do if "%%~xF" neq "" (
  set "ext=%%~xF"
  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 "ext=!ext:%%C=%%C!"
  ren "%%F" "%%~nF!ext!"
)

巴厘岛C在他的回答中有一个有趣的想法,但并不完全奏效。我在一个临时文件夹中创建了一个临时文件,其名称仅包含文件扩展名,从而使其正常工作。但它比上述解决方案慢

@echo off
setlocal
set "folder=%temp%\ren%random%"
md "%folder%"
for /r "c:\test" %%F in (*) do if "%%~xF" neq "" (
  copy nul "%folder%\%%~xF" >nul
  for /f "delims=" %%X in ('dir /b /l "%folder%"') do ren "%%F" "%%~nF%%X"
  del /q "%folder%"
)
rd "%folder%"

有趣的想法,但是
%%~xs
扩展为文件名的本机大小写。DIR/L生成的小写字母丢失。+1;虽然你的代码不起作用,但它是我回答中第二个有效解决方案的基础。是的,我不知道如何保持
dir
创建的版本,我曾考虑使用临时文件,但无法解决:)