0

我正在尝试编写一个脚本,它将递归地搜索文件夹中的所有文件并在每个文件上运行命令和/或命令列表。这是我需要它如何工作的示例:

  • 在文件夹中搜索文件名中包含“1080p”的文件
  • 将此文件复制到本地目录,但从文件名中删除“1080p”
  • 在这些文件上运行另一个批处理脚本(我已经让那部分工作)

所有这些都需要自动化。

我需要在 Windows 命令提示符下执行此操作,并且我愿意使用所需的任何其他程序。
我已经在类似的批处理脚本中使用了 SED。

4

2 回答 2

3
@echo off
setlocal disableDelayedExpansion

set "src=sourcePath"
set "dst=destinationPath"
set "search=1080p"

for /r "%src%" %%F in (*%search%*) do (
  set "full=%%~fF"
  set "name=%%~nxF"
    setlocal enableDelayedExpansion
    copy "!full!" "%dst%\!name:%search%=!"
    endlocal
)
REM call your batch script here to process the copied files

如果多个源文件夹中存在相同的文件名,您可能会遇到问题。但这是您陈述的要求的普遍问题。

解释:

%%~fF给出包含在 %%F 中的文件的完整路径

$$~nxF仅给出 %%F 中包含的文件的名称和扩展名

类型HELP FORFOR /?有关可用于 FOR 变量扩展的修饰符的更多信息。

!name:%search%=!使用延迟扩展来搜索 name 的内容并将搜索值替换为空。在本例中,%search%=1080p。请注意,搜索不区分大小写。

在循环内进行搜索和替换时,我需要使用延迟扩展,因为在解析语句时会发生使用百分比的正常扩展。但是整个 FOR 结构,包括括号的内容,被解析为一个逻辑语句。所以正常的扩展会在循环执行之前给出 name 的值。那是行不通的 :-) 每次执行该行时,延迟扩展都会给出当前值。

键入HELP SETSET /?以获取有关搜索和替换以及延迟扩展的更多信息。

我需要打开和关闭延迟扩展,因为!它是文件名中的有效字符,如果 %%F 扩展包含!.

于 2012-06-05T17:41:23.357 回答
2

我建议使用 cygwin 来轻松利用一些常见的 Unix 实用程序,尽管您可能可以一一找到 Windows 编译的版本(即 perl):

按名称查找文件列表,对每个文件执行命令:

find . -name \*1080p\* | xargs <command>

查找文件列表,创建移动/重命名命令列表以去除“1080p”字符串:

find . -name \*1080p\* | perl -ne 'chomp();$x=$_;s/1080p//g;print"cp $x /target/$_\n"'
# add "| sh" to run the commands, or "> commands.sh" to generate a script

应该在 CMD 中运行的命令只需要 PERL

dir /s /b | perl -ne 'chomp();$x=$_;s/1080p//g;print"copy $x c:\target\$_\n"' > cmds.bat

调整脚本,当然,做你需要的。但是,我相信这将实现您的目标。使用 Windows CMD 可能有一个聪明的方法来做到这一点,但我不是 CMD 专家。Unix实用程序(恕我直言)更加简单!

于 2012-06-05T16:19:28.307 回答