【发布时间】:2012-02-22 14:02:22
【问题描述】:
如何通过输入参数在我的 dos 脚本中运行命令?
简化脚本 bla.bat:
呼叫 %1
叫它:
bla.bat "echo 'hello'" (或 bla.bat "git status")
错误:
'"git status"' 未被识别为内部或外部命令,
可运行的程序或批处理文件。
如果我执行“CALL git status”,它会起作用。
【问题讨论】:
标签: batch-file dos
如何通过输入参数在我的 dos 脚本中运行命令?
简化脚本 bla.bat:
呼叫 %1
叫它:
bla.bat "echo 'hello'" (或 bla.bat "git status")
错误:
'"git status"' 未被识别为内部或外部命令,
可运行的程序或批处理文件。
如果我执行“CALL git status”,它会起作用。
【问题讨论】:
标签: batch-file dos
要记住的重要一点是,扩展文本的外观必须与您在命令行中简单地键入命令时的外观完全相同。 (实际上也有一些例外,但这是一个很好的起点)。
要调试您的脚本,只需在调用前添加一个回显:@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"
请注意,批处理具有各种特殊情况,可能需要额外或不同的编码才能解决。太多了,无法列出 - 只是期待意外。
【讨论】:
看起来问题可能是您的输入中有引号,您需要阻止它被分解为不同的 %n 参数,但请尝试:
%~1 将从输入中删除所有周围的引号。
%~$PATH:1 将去除所有周围的引号,然后在 $PATH env-var 中搜索第一个匹配项,然后扩展字符串以包含命令的完整路径,这对于使用 windows 发行版的 git 不起作用因为git是一个批处理文件,cmd会查找git status.bat
如果它要与git一起使用,你也可以使用%~1和%~2来调用git,然后将参数提供给git批处理文件,或者通过修改你的$PATH直接调用git.exe。但请记住,git.bat 在调用 git 之前会自行设置一些环境。
【讨论】:
我认为您需要%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 %*
如果您想通过命令行参数进行解析,请告诉我。
【讨论】:
问题是参数之间的空格让你失望(这就是你在 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 循环,不允许您使用在其内部设置的变量,因此您需要启用变量的“延迟扩展”。然后,您设置的变量需要封装在感叹号(不是 %'s)中。当然,!VAR1! 之间的空格!并且 %%A 防止参数在 CALL 中一起运行。
【讨论】: