0

我正在清理成千上万的文件名,大多数的结构像:“xxxx xxxx - xxxxx xxxx xxxx.yyy”问题是有些是大写的,有些则不是。 (其实也有其他问题,但我可以很容易地解决这些问题。)如何使用FINDSTR大写所有单词的字符串?

我想采取任何字符的字符串,并在任何时间段之前大写它的所有单词。
最好使用一行代码,使用管道而不是使用文件,就像使用FIND一样。
最后,我宁愿只是一次大写整个字符串,但我并不反对分别处理每个单词。

实施例:

Input: "this - string IS an EXAMPLE 4 u" 
Output: "This - String IS An EXAMPLE 4 U" 

欲忽略所有大写和非字母字符(破折号,下划线,数字,等),只是将它们传递通过不受影响。

所以我想能够使用这样的代码(2号线是相关的):

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下载的)提供支持。

在此先感谢!

回答

2

FINDSTR对正则表达式的支持是非常有限。从命令行输入HELP FINDSTRFINDSTR /?,您将看到我的意思。更糟糕的是,支持的正则表达式是以非标准方式实现的。看看What are the undocumented features and limitations of the Windows FINDSTR command? - 正则表达式的限制是在答案的底部描述的。最终的结果是FINDSTR在你的情况下不会有任何帮助(没有双关意图)。

我相信应该很容易做到你想用PowerShell做什么,但是我还没有学会这种语言。您也可以使用VBScript或JScript。所有三个都有强大的正则表达式支持。

不使用正则表达式实现批处理解决方案并不困难。

如果您有一个包含文件名(可能包含路径信息)的FOR变量%%F,那么%%~nF将为您提供该文件的名称,不带扩展名。 %%~xF会给你文件的扩展名。从命令行输入HELP FOR即可获取完整文档。

没有内置命令将字符串转换为大写字母,但使用另一个FOR循环实现并不重要。 SET命令支持搜索和替换,搜索部分不区分大小写。所以它只需要搜索并替换每个字母。

编辑
我已经固定的代码,只为每个字的第一个字母为请求。该代码只将空间识别为单词边界。您将不得不添加一个额外的搜索并替换您希望支持的每个字符作为字边界。

@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,该脚本将实际重命名您的文件。

+0

编辑 - 第二个解决方案丢失循环内的ENDLOCAL。现在全部修好了。 – dbenham 2012-07-17 14:06:50

+0

有趣。但我想我不清楚。我想只是把这个词大写(第一个字符在上面),而不是整个单词。抱歉。尽管你的方法让我思考。我只是使用了26个不同的命令,比如“set nam =%nam:a = A%”。我会看看我是否可以用你的方法将其缩短为几行。对不起,我没有代表投票给你。不管怎么说,还是要谢谢你! – 2012-07-27 08:52:58

+0

刚刚得到代表投票了,所以我做到了。^_^ – 2012-07-27 10:17:39

相关问题