gpt4 book ai didi

windows - 使用可变数量的参数调用批处理文件

转载 作者:可可西里 更新时间:2023-11-01 09:44:31 25 4
gpt4 key购买 nike

基本上,下面的脚本可以用三种不同的方式使用:调用 foo

  1. .bat boot_up“路径”
  2. .bat 停止“路径”
  3. .bat ssh "路径""命令"

我不能保证路径或命令没有空格。

当我使用 foo.bat 执行我的子例程 ssh 时,一切正常。相反,当我尝试调用我的子例程 boot_uphalt 时,出现错误:

( was unexpected at this time.

但是,如果我向 boot_uphalt 添加第三个参数,那么一切都会再次正常。

所以我的问题是,如何管理参数长度可变的批处理文件的调用?

:main
echo Argument 1: (%1)
echo Argument 2: (%2)
echo Argument 3: (%3)

call :set_cygwin_env || exit /b 1

if not "%1"=="" if not %2=="" (
if "%1"=="boot_up" (
call :boot_up %2
) else if "%1"=="halt" (
call :halt %2
) else if "%1"=="ssh" if not %3=="" (
call :ssh %2 %3
) else (
call :show_help || exit /b 1
)
) else (
call :show_help || exit /b 1
)
:exit

最佳答案

你的错误来源是 ) else if "%1"=="ssh"if not %3==""( - 当你没有传递第三个参数时,你的代码扩展为 ) else if "halt"=="ssh"if not ==""(,这是无效语法。整个复合语句必须具有有效语法,即使是不触发的分支。您必须确保比较的左侧至少有一个字符。通常使用引号括起来,因为它们可以防止 &| 等有害字符,以及 token分隔符,如空格、逗号、等号、制表符。

通常,在与命令行参数进行比较时,您应该使用 if "%~1"=="someValue"...~ 删除任何现有的封闭引号,然后您明确添加自己的引号。首先删除引号很重要,因为您无法预料用户是否添加了自己的引号。可以传入像 "this&that" 这样的值,因此 "%1" 将扩展为 ""this&that"",而 & 将不再被引用。 "%~1" 扩展为所需的"this&that"。此策略并非万无一失,但它与不做 crazy batch programming 一样好。你可能不想进入。

所以你的固定代码应该是这样的

:main
echo Argument 1: (%1)
echo Argument 2: (%2)
echo Argument 3: (%3)

call :set_cygwin_env || exit /b 1

if not "%~1"=="" if not "%~2"=="" (
if "%~1"=="boot_up" (
call :boot_up %2
) else if "%~1"=="halt" (
call :halt %2
) else if "%~1"=="ssh" if not "%~3"=="" (
call :ssh %2 %3
) else (
call :show_help || exit /b 1
)
) else (
call :show_help || exit /b 1
)
:exit

关于windows - 使用可变数量的参数调用批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40673824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com