如何在输入参数的dos脚本中运行命令?
简化脚本bla.bat:
CALL%1
称之为:
bla.bat“echo'hello'”(或bla.bat“git status”)
错误:
'“git status”'不被视为内部或外部命令,
可操作程序或批处理文件。
如果我执行“CALL git status”,它就有效。
答案 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中一起运行。