用于构建ruby gem的批处理脚本

时间:2017-09-11 06:53:05

标签: ruby batch-file rubygems

我有以下目录结构。

build
  -build.bat
package
  -gems
    -abc.gem
    -xyz.gem
  -install.sh
plugins
  -abc
    -abc.gemspec
  -xyz
    -xyz.gemspec

我正在尝试在build文件夹中编写批处理文件build.bat。 它应该执行的任务是:

  1. 删除package / gems文件夹中的所有先前文件
  2. 在plugins文件夹的每个子目录中,执行

    gem build *.gemspec

    此命令将在同一目录中创建一个gem文件。

  3. 将创建的gem文件移至package / gems文件夹
  4. 我一直在进行批处理编程语法,我甚至不确定是否可以通过批处理脚本来实现。如何编写将执行这些任务的批处理脚本?

    [编辑]

    经过一些基础研究后,我完成了很多任务。

    @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后,一切正常。

1 个答案:

答案 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重定向器是单引号命令到执行的一部分而不是for2>nul重定向任何不需要的"未找到"任何出现都会显示findstr无处的输出(重定向2 = stderr)。

for将{{1>}的所有行(= 可能包含空格的文件名)全部分配给%%a,因为"delims="表示"没有分隔符&# 34;

因此,%%a应仅包含以.gem结尾的文件名。

引用只是一个好的策略 - 它基本上逃脱了像 Space 这样的分隔符的标准操作,并删除了它们的特殊含义。