0

我正在清理数千个文件名,大多数文件名的结构如下:“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 或任何其他 3rd 方软件建议,尽管我愿意接受其他基于 MS 的解决方案(Enterprise 或 Ultimate 附带的或可从 Microsoft 下载的东西)。

提前致谢!

4

1 回答 1

2

FINDSTR 对正则表达式的支持极为有限。从命令行输入 or ,你就会明白我的意思了HELP FINDSTRFINDSTR /?更糟糕的是,支持的正则表达式功能是以非标准方式实现的。看看Windows FINDSTR 命令有哪些未记录的功能和限制?- 正则表达式限制在答案的底部进行了描述。最终结果是 FINDSTR 对您的情况没有任何帮助(不是双关语)。

我相信用 PowerShell 做你想做的事情应该相当容易,但我还没有学过那种语言。您也可以使用 VBScript 或 JScript。这三个都具有强大的正则表达式支持。

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

如果你有一个%%F包含文件名的 FOR 变量(可能带有路径信息),那么%%~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,脚本就会真正重命名您的文件。

于 2012-07-17T12:00:47.020 回答