Batch file 在dos批处理脚本中以命令形式运行输入参数?
如何从输入参数在dos脚本中运行命令 简化脚本bla.bat:Batch file 在dos批处理脚本中以命令形式运行输入参数?,batch-file,dos,Batch File,Dos,如何从输入参数在dos脚本中运行命令 简化脚本bla.bat: 呼叫%1 叫它: bla.bat“echo'hello'”(或bla.bat“git status”) 错误: “git status”未被识别为内部或外部命令, 可操作的程序或批处理文件 如果我真的“调用git状态”,它就会工作。我想您需要%1%来回显参数。这是我的蹩脚脚本,我认为它符合您的要求,与您的echo测试配合使用: bla echo hello 给出: C:\tmp>echo bla bl
呼叫%1 叫它:
bla.bat“echo'hello'”(或bla.bat“git status”) 错误:
“git status”未被识别为内部或外部命令, 可操作的程序或批处理文件
如果我真的“调用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 %*
如果您想通过命令行参数进行解析,请告诉我。我认为您需要
%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 %*
如果要通过命令行参数进行分析,请告诉我。问题可能是输入中有周围的引号,您需要停止将其拆分为不同的%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之前会自己进行一些环境设置。问题可能是输入中有周围的引号,您需要停止将其拆分为不同的%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之前会自己进行一些环境设置。需要记住的重要一点是,扩展文本的外观必须与从命令行键入命令时的外观完全相同。(实际上有一些例外,但这是一个很好的起点) 要调试脚本,只需在调用之前放置一个echo:
@echo call%1
。现在试着像前面一样运行:blah.bat“echo'hello'”
生成调用“echo'hello'”
。试着从命令行运行它-它不起作用。您需要呼叫echo'hello'
一种修复方法是稍微更改脚本:~
修饰符带括参数中的引号
@echo off
call %~1
或者您可以放弃调用,只需使用以下命令(只要您没有调用另一个要返回的批处理文件)
如果命令行上没有其他参数,最好使用扩展到所有参数的%*
@echo off
%*
REM or call %*
现在您可以这样调用您的批
blah.bat echo "hello"
请注意,批处理有各种各样的特殊情况,可能需要额外或不同的编码来解决。要列出的内容太多-只需预料到意外情况。需要记住的重要一点是,展开的文本必须与从命令行键入命令时的外观完全相同。(实际上有一些例外,但这是一个很好的起点) 要调试脚本,只需在调用之前放置一个echo:
@echo call%1
。现在试着像前面一样运行:blah.bat“echo'hello'”
生成调用“echo'hello'”
。试着从命令行运行它-它不起作用。您需要呼叫echo'hello'
一种修复方法是稍微更改脚本:~
修饰符带括参数中的引号
@echo off
call %~1
或者您可以放弃调用,只需使用以下命令(只要您没有调用另一个要返回的批处理文件)
如果命令行上没有其他参数,最好使用扩展到所有参数的%*
@echo off
%*
REM or call %*
现在您可以这样调用您的批
blah.bat echo "hello"
请注意,批处理有各种各样的特殊情况,可能需要额外或不同的编码来解决。太多了,无法列出-只是期待意外的结果。问题在于参数之间的空格让您感觉不舒服(这就是为什么您在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可防止参数在调用中同时运行。问题在于参数之间的空格会使您感到不适(这就是为什么您在git status周围使用引号) 修改bla.bat以遍历命令行参数。这项工作