我正在清理成千上万的文件名,大多数都有如下结构:“xxxx xxxx - xxxxx xxxx xxxx.yyy”问题是有些是大写的,有些则不是。 (实际上还有其他问题,但我可以轻松解决这些问题。)
我想取一串任何字符,并在任何时期之前将所有字词大写 最好使用单行代码,使用管道,而不是使用文件,就像使用FIND一样 最后我宁愿一次大写整个字符串,但我并不反对单独处理每个单词。
实施例:
Input: "this - string IS an EXAMPLE 4 u"
Output: "This - String IS An EXAMPLE 4 U"
我想忽略所有大写和非字母字符(破折号,下划线,数字等),只是将它们传递给不受影响。
所以我希望能够使用这样的代码(第二行是相关的代码):
for /f "tokens=*" %%x in ('dir /b *.zzz') do (
for /f "tokens=*" %%y in ('echo %%x ^| findstr /r "s/\s\w/\U$&/g;"') do (
rename "%%x" "%%y" ))
如果可能的话,我希望能够在命令行上测试它,如下所示:
echo hello to you | findstr /r "s/\s\w/\U$&/g;"
我的问题是上面的例子没有提供任何输出。
正如您所看到的,我搜索了正则表达式的示例,但无法通过findstr进行即插即用。
我宁愿不把文件扩展大写,但这很容易修复,所以我真的不在乎。
请不要使用sed,grep或任何其他第三方软件建议,但我会接受其他基于MS的解决方案(Enterprise或Ultimate附带的或可从Microsoft下载的内容)。
提前致谢!
答案 0 :(得分:2)
FINDSTR对正则表达式的支持极其有限。从命令行键入HELP FINDSTR
或FINDSTR /?
,您将看到我的意思。更糟糕的是,支持的正则表达式功能以非标准方式实现。看一下What are the undocumented features and limitations of the Windows FINDSTR command? - 在答案的底部描述了正则表达式的限制。最终的结果是FINDSTR对你的情况没有任何帮助(没有双关语意)。
我相信使用PowerShell做你想做的事应该相当容易,但我还没有学过那种语言。您也可以使用VBScript或JScript。这三个都有强大的正则表达式支持。
不使用正则表达式实现批处理解决方案并不困难。
如果你的FOR变量%%F
包含文件名(可能带有路径信息),那么%%~nF
将只提供文件名,不带扩展名。 %%~xF
会为您提供文件的扩展名。从命令行键入HELP FOR
以获取完整文档。
没有内置命令将字符串转换为大写字母,但使用另一个FOR循环实现它是微不足道的。 SET命令支持搜索和替换,搜索部分不区分大小写。所以它只需要搜索并替换每个字母。
<强> 修改 强>
我修改了代码,只按要求将每个单词的第一个字母大写。代码仅将空格识别为单词边界。您必须为要支持的每个字符添加额外的搜索和替换op作为单词边界。
@echo off
setlocal enableDelayedExpansion
for %%F in (*.yyy) do (
set "name= %%~nF"
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 "name=!name: %%C= %%C!"
set "name=!name:~1!"
echo ren "%%F" "!name!%%~xF"
)
除了一个潜在的问题之外,上述工作很有效:它会破坏包含!
字符的任何文件名,因为在展开%%F
时启用了延迟扩展。修复方法是在循环内打开和关闭延迟扩展。
@echo off
setlocal disableDelayedExpansion
for %%F in (*.yyy) do (
set "original=%%F"
set "name= %%~nF"
set "ext=%%~xF"
setlocal enableDelayedExpansion
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 "name=!name: %%C= %%C!"
set "name=!name:~1!"
echo ren "!original!" "!name!!ext!"
endlocal
)
上面的两个脚本都只是ECHO将执行的重命名命令。只需删除REN之前的ECHO,脚本就会实际重命名文件。