我有以下目录结构。
build
-build.bat
package
-gems
-abc.gem
-xyz.gem
-install.sh
plugins
-abc
-abc.gemspec
-xyz
-xyz.gemspec
我正在尝试在build文件夹中编写批处理文件build.bat。 它应该执行的任务是:
在plugins文件夹的每个子目录中,执行
gem build *.gemspec
此命令将在同一目录中创建一个gem文件。
我一直在进行批处理编程语法,我甚至不确定是否可以通过批处理脚本来实现。如何编写将执行这些任务的批处理脚本?
[编辑]
经过一些基础研究后,我完成了很多任务。
@echo on
cd..
set CUR_DIR=%cd%
set GEMS_DIR=%CUR_DIR%\Package\gems
set PLUGINS_DIR=%CUR_DIR%\Plugins
del /f/s/q/a %GEMS_DIR%\
cd %PLUGINS_DIR%
for /d %%D in (*) do (
pushd %%~fD
gem build *.gemspec
move *.gem %GEMS_DIR%
popd
)
但是,move命令会复制.gem和.gemspec文件。如何限制它只移动.gem文件?此外,在最后一个括号之后添加的任何行都不会执行。 任何其他改进将不胜感激。谢谢。
[EDIT2]
我在foor循环后添加的任何行都没有被执行。在gem命令的前面添加call
后,一切正常。
答案 0 :(得分:1)
替换
move *.gem %GEMS_DIR%
与
for /f "delims=" %%a in ('dir /b /a-d *.gem* ^|findstr /E /L /I ".gem" 2^>nul') do move "%%a" "%gems_dir%"
指出的是:
%%a
语句中的for
可以是任何字母(除了用于外循环的D
)和 IS 区分大小写,而就指令和变量而言,批处理是不区分大小写的。
这将生成/b
(基本)dir
列表(仅限名称)/a-d
,不含目录名,匹配*.gem*
的文件。这自然会选择*.gem
和*.gemspec
个文件(由move *.gem
提取,因为它们的短名称为某些~n.gem (请参阅dir /x
列表)。
生成列表(在内存中)后,将列表导管到findstr
以查找/E
结束/L
文字/I
的所有行(即文件名) case-Insensitive" .gem"。 ^
转义重定向器字符,告诉cmd
重定向器是单引号命令到执行的一部分而不是for
。 2>nul
重定向任何不需要的"未找到"任何出现都会显示findstr
到无处的输出(重定向2 = stderr)。
for
将{{1>}的所有行(= 可能包含空格的文件名)全部分配给%%a
,因为"delims="
表示"没有分隔符&# 34;
因此,%%a
应仅包含以.gem
结尾的文件名。
引用只是一个好的策略 - 它基本上逃脱了像 Space 这样的分隔符的标准操作,并删除了它们的特殊含义。