在dos批处理脚本中运行输入参数作为命令?

时间:2012-02-22 14:02:22

标签: batch-file dos

如何在输入参数的dos脚本中运行命令?

简化脚本bla.bat:
CALL%1

称之为:
bla.bat“echo'hello'”(或bla.bat“git status”)

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

如果我执行“CALL git status”,它就有效。

4 个答案:

答案 0 :(得分: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"

请注意,批处理具有各种特殊情况,可能需要额外或不同的编码才能解决。列出太多 - 只是期待意外。

答案 1 :(得分:2)

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

%~1这将从输入中删除任何周围的引号。

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

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

答案 2 :(得分: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 :(得分:0)

问题是参数之间的空格会让你失望(这就是你在git status周围使用引号的原因)。

修改你的bla.bat以迭代你的命令行参数。这对我有用:

SETLOCAL ENABLEDELAYEDEXPANSION

SET VAR1=

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

call %VAR1%

ENDLOCAL

然后,运行你的bla.bat而没有git status周围的引号。

bla git status

本质上,它的作用是遍历命令行参数,然后将它们全部作为一个命令执行。挑战来自DOS中的FOR循环,不允许您使用您自己设置的变量,因此您需要启用变量的“延迟扩展”。然后,您设置的变量需要封装在感叹号中(而不是%')。当然还有!VAR1之间的空间!和%% A使参数不会在CALL中一起运行。