2012-02-22 331 views
1

如何从输入参数在我的dos脚本中运行命令?在dos批处理脚本中运行输入参数作为命令?

简化脚本bla.bat:
  CALL%1

叫它:
bla.bat “回声 '你好'”(或bla.bat “混帐地位”)

错误:
''git status''不被识别为内部或外部命令, 可操作的程序或批处理文件。

它工作,如果我做“CALL git status”。

回答

2

它看起来像问题可能是你在你的输入,你需要阻止它被分成不同的%n个参数包围引号,但尝试:

%~1这将剥夺任何周边来自输入的引号。

%~$PATH:1这将剥离任何周围的引号,然后在$ PATH env-var中搜索第一个匹配,然后展开字符串以包含命令的完整路径,这对于使用Windows发行版的git不起作用,因为git是一个批处理文件,而cmd会寻找git status.bat

如果要和git一起使用,你可以使用%〜1和%〜2来调用git,然后将参数提供给git批处理文件,或者通过修改$ PATH直接调用git.exe。但请记住,在调用git之前,git.bat会自行设置一些环境。

+0

感谢所有的详细解答,加入了〜字符的伎俩,是不够的,即使有“混帐地位” – edbras 2012-02-22 22:51:54

1

我想你需要%1%来回显参数。这里是我的跛脚脚本,我觉得你想要做什么,与您的echo测试:

bla echo hello 

给出:

C:\tmp>echo bla 
    bla 

    C:\tmp>echo echo 
    echo 

    C:\tmp>CALL echo hello 
    hello   

    echo %0% 
    echo %1% 
    CALL %* 

如果你想通过命令行参数解析,让我知道。

3

要记住的重要一点是,如果您只是简单地从命令行输入命令,扩展文本的外观必须完全相同。 (实际上有一些例外,但这是一个很好的起点)。

要调试您的脚本,只需在呼叫前加上回声:@echo call %1。现在尝试运行,就像你之前做的那样:blah.bat "echo 'hello'"产生call "echo 'hello'"。尝试从命令行运行它 - 它不起作用。你想要call echo 'hello'

一个解决将是稍微改变你的脚本:在~修饰条从参数

@echo off 
call %~1 

封闭引号或者您可能能够沟呼叫,只需使用下面的(只要你是不是要求您要从返回另一个批处理文件)

@echo off 
%~1 

如果在命令行上没有其他的参数,你可能会更好使用%*它扩展到所有参数

@echo off 
%* 
REM or call %* 

现在你可以打电话给你批像这样

blah.bat echo "hello" 

注意,一批具有各种特殊情况下的怪事,这将有可能需要额外或不同的编码来解决的。列表太多 - 只是期待意外。

0

问题是参数之间的空间都扔你了(这就是为什么你用身边的git状态引号)。

修改您的bla.bat通过您的命令行paremeters进行迭代。这适用于我:

SETLOCAL ENABLEDELAYEDEXPANSION 

SET VAR1= 

FOR %%A IN (%*) DO (
    SET VAR1=!VAR1! %%A 
) 

call %VAR1% 

ENDLOCAL 

然后,运行您的bla.bat不带引号周围的git状态。

bla git status 

本质上,它所做的是遍历您的命令行参数,然后将它们全部作为一个命令执行。我们面临的挑战来自于在DOS中循环不允许你使用,你自己内部设置变量,所以你需要启用的变量“延迟扩展”。然后,在惊叹号封装,你需要设置变量(未%的)。当然,!VAR1之间的空间!和%% A保持参数不在CALL中一起运行。

+0

我觉得有必要提及的是,什么样的人已经张贴在这里的答案光;我的方式绝对是“长”的方式。做一个CALL%*或CALL%〜1应该做你想要什么。 – Aaron 2012-02-22 15:05:59