我正在尝试编写一个脚本,该脚本将在文件夹中递归搜索所有文件,并在每个文件上运行命令和/或命令列表。以下是我需要它如何工作的示例:
所有这一切都需要自动化。
我需要在Windows命令提示符下执行此操作,并且我愿意使用所需的任何其他程序 我已经在类似的批处理脚本中使用了SED。
答案 0 :(得分: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 FOR
或FOR /?
,了解有关FOR变量扩展的修饰符的更多信息。
!name:%search%=!
使用延迟扩展来搜索名称的内容,并用任何内容替换搜索值。在此示例中,%search%= 1080p。请注意,搜索不区分大小写。
我需要在循环中进行搜索和替换时使用延迟扩展,因为在解析语句时会使用百分比进行正常扩展。但是整个FOR构造(包括括号的内容)被解析为一个逻辑语句。因此,正常扩展将在循环执行之前给出name的值。这不起作用:-)延迟扩展在每次执行行时都会给出当前值。
键入HELP SET
或SET /?
,了解有关搜索和替换以及延迟展开的详情。
我需要打开和关闭延迟扩展,因为!
是文件名中的有效字符,而%% F扩展会破坏该值(如果它包含!
。
答案 1 :(得分: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实用程序(恕我直言)要简单得多!