2017-09-11 137 views
-1

我有以下目录结构。构建红宝石宝石的批处理脚本

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

我想在构建文件夹中编写批处理文件build.bat。 应该执行的任务是:

  1. 删除包中的任何以前的文件/宝石夹
  2. plugins文件夹中的每个子目录里面,执行

    gem build *.gemspec

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

  3. 移动创建打包宝石文件/文件夹的宝石

我一直在经历批处理编程语法,我甚至不知道这是否可以通过批处理脚本或无法实现。我怎样才能编写一个批处理脚本来完成这些任务?

[编辑]

一些基本的研究后,我能够完成很多的任务。

@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]

的福尔循环i之后添加的任何线没有被执行。在添加了call宝石命令之后,一切正常。

+0

这很可能是可以完成的 - 而且很容易。但是,该网站不是免费的代码写入服务。请编辑您尝试使用'edit'工具将问题解决到您的帖子中,然后如果遇到任何问题,我们可能会尝试将其磨合到运行状态。 – Magoo

+0

@Magoo感谢您在批处理脚本中进行自己的研究的动力。喜欢你的个人资料中的这一行 - “我不介意解决愚蠢和明显的问题。保持我的灰色物质剩下的东西不会固化。“ –

+0

最后一个括号后面的行?正如尼尔森可能会说的:“我看不到任何线......” – Magoo

回答

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%" 

注意到:

%%afor语句可以是任何字母(除了D其用于外回路)和IS区分大小写,而batch否则不区分大小写就指示和变量而言。

这会生成/b(基本)dir上市(即只名称)/a-d没有数据夹,文件的匹配*.gem*。这自然会选择*.gem*.gemspec文件(这是由move *.gem回升,因为他们的用的东西〜n.gem短名称(见dir /x上市)。

已经产生了上市(以内存),管道列表findstr找到所有行(即。文件名)其中/E结束/L与文字/I大小写不敏感“.gem”。 ^转义重定向字符告诉cmd重定向器是单引号命令对执行而不是for的一部分。 2>nul将任何不需要的“未找到”输出从findstr重定向到无处应该出现(重定向2 = stderr)。

for分配任何线(=文件名,其可以包含空格)%%a的整体自"delims="意思是“没有分隔符”

因此,%%a应该只包含文件(一个或多个)的名称,其特别结束.gem

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

+0

谢谢。这工作。 –