如何从输入参数在我的dos脚本中运行命令?在dos批处理脚本中运行输入参数作为命令?
简化脚本bla.bat:
CALL%1
叫它:
bla.bat “回声 '你好'”(或bla.bat “混帐地位”)
错误:
''git status''不被识别为内部或外部命令, 可操作的程序或批处理文件。
它工作,如果我做“CALL git status”。
如何从输入参数在我的dos脚本中运行命令?在dos批处理脚本中运行输入参数作为命令?
简化脚本bla.bat:
CALL%1
叫它:
bla.bat “回声 '你好'”(或bla.bat “混帐地位”)
错误:
''git status''不被识别为内部或外部命令, 可操作的程序或批处理文件。
它工作,如果我做“CALL git status”。
它看起来像问题可能是你在你的输入,你需要阻止它被分成不同的%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会自行设置一些环境。
我想你需要%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 %*
如果你想通过命令行参数解析,让我知道。
要记住的重要一点是,如果您只是简单地从命令行输入命令,扩展文本的外观必须完全相同。 (实际上有一些例外,但这是一个很好的起点)。
要调试您的脚本,只需在呼叫前加上回声:@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"
注意,一批具有各种特殊情况下的怪事,这将有可能需要额外或不同的编码来解决的。列表太多 - 只是期待意外。
问题是参数之间的空间都扔你了(这就是为什么你用身边的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中一起运行。
我觉得有必要提及的是,什么样的人已经张贴在这里的答案光;我的方式绝对是“长”的方式。做一个CALL%*或CALL%〜1应该做你想要什么。 – Aaron 2012-02-22 15:05:59
感谢所有的详细解答,加入了〜字符的伎俩,是不够的,即使有“混帐地位” – edbras 2012-02-22 22:51:54