Batch file 在dos批处理脚本中以命令形式运行输入参数?

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

如何从输入参数在dos脚本中运行命令

简化脚本bla.bat:
呼叫%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以遍历命令行参数。这项工作