如何从输入参数在dos脚本中运行命令?
简化脚本bla.bat:
致电%1
称它为:
bla.bat" echo'hello'"(或bla.bat" git status")
错误:
无法将"" git status""识别为内部或外部命令,
可操作的程序或批处理文件。
如果我执行" CALL git status",它会起作用。
要记住的重要一点是,如果只是从命令行键入命令,则扩展后的文本必须看起来完全相同。 (实际上有一些例外,但这是一个很好的起点)。
要调试脚本,只需在调用之前放置回显:@echo call %1。现在尝试像以前一样运行:blah.bat"echo 'hello'"生成call"echo 'hello'"。尝试从命令行运行该命令-它不起作用。您需要call echo 'hello'。
一种解决方法是稍微更改脚本:~修饰符去除参数中的引号
或者,您可以放弃呼叫并仅使用以下命令(只要您没有呼叫要返回的另一个批处理文件)
@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本身之前进行一些环境设置。
感谢所有人提供的详细答案,添加?字符可以解决问题,即使带有" git status"也足够了
我认为您需要%1%来回显参数。这是我的la脚脚本,我认为该脚本可以满足您的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
然后,运行不带git status引号的bla.bat。
bla git status
本质上,此操作是遍历命令行参数,然后将它们全部作为一个命令执行。挑战来自DOS中的FOR循环,不允许您使用自己设置的变量,因此您需要启用变量的"延迟扩展"。然后,您要设置的变量需要封装在感叹号(而不是%)中。当然,!VAR1!之间的空间!和%% A可以防止参数在CALL中一起运行。
考虑到其他人在这里发表的答案,我不得不说。 我的方法肯定是"漫长的"方法。 执行CALL%*或CALL%?1应该可以做您想要的。