我正在尝试编写一个脚本,它将递归地搜索文件夹中的所有文件并在每个文件上运行命令和/或命令列表。这是我需要它如何工作的示例:
- 在文件夹中搜索文件名中包含“1080p”的文件
- 将此文件复制到本地目录,但从文件名中删除“1080p”
- 在这些文件上运行另一个批处理脚本(我已经让那部分工作)
所有这些都需要自动化。
我需要在 Windows 命令提示符下执行此操作,并且我愿意使用所需的任何其他程序。
我已经在类似的批处理脚本中使用了 SED。
我正在尝试编写一个脚本,它将递归地搜索文件夹中的所有文件并在每个文件上运行命令和/或命令列表。这是我需要它如何工作的示例:
所有这些都需要自动化。
我需要在 Windows 命令提示符下执行此操作,并且我愿意使用所需的任何其他程序。
我已经在类似的批处理脚本中使用了 SED。
@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 FOR
或FOR /?
有关可用于 FOR 变量扩展的修饰符的更多信息。
!name:%search%=!
使用延迟扩展来搜索 name 的内容并将搜索值替换为空。在本例中,%search%=1080p。请注意,搜索不区分大小写。
在循环内进行搜索和替换时,我需要使用延迟扩展,因为在解析语句时会发生使用百分比的正常扩展。但是整个 FOR 结构,包括括号的内容,被解析为一个逻辑语句。所以正常的扩展会在循环执行之前给出 name 的值。那是行不通的 :-) 每次执行该行时,延迟扩展都会给出当前值。
键入HELP SET
或SET /?
以获取有关搜索和替换以及延迟扩展的更多信息。
我需要打开和关闭延迟扩展,因为!
它是文件名中的有效字符,如果 %%F 扩展包含!
.
我建议使用 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实用程序(恕我直言)更加简单!