当前位置: 首页 > 知识库问答 >
问题:

将函数的值返回给批处理脚本中的函数

夹谷鸿福
2023-03-14

这可能是SO、dostips和ss64中几个问题的重复。我所做的研究告诉我要注意函数中的作用域。但我的解决方案简单明了,但问题依然存在

  1. SETLOCALENDLOCAL
  2. 背后的真正含义
  3. 上下文如何在批处理脚本中工作,例如goto)2

以下是我迄今为止编写的代码,用于将文件从一个地方复制到另一个地方。我的目标是:

  • 研究批处理脚本的范围上下文
  • 代码重用

    @echo off
    setlocal EnableDelayedExpansion
    goto :main

:main
    setlocal
    set _app=test
    set _base=C:/wamp64/www
    set _destination=!_base!/test
    set _source=%~dp0%/build
    set /A _flag=0

    echo *********************************************
    echo    Deploying in %~1 mode: %TIME%
    echo        Deploy path: !^_destination!
    echo *********************************************

    call :check !_base!, !_app!, _flag
    if !_flag!==0 (
        call :create !_base!, !_app!
    )
    xcopy "!_source!" "!_destination!" /D /C
    exit /b 0
    endlocal

:setbase 
    echo ::::: setting up base :::::
    chdir /D C:

    rem the base dir for app to exists=> %1
    chdir %~1 
    exit /b 0

:check 
    echo ::::: checking for local web server destination :::::
    call :setbase %~1

    set %~3= dir /p|find /C "%~2"
    exit /b 0

:create 
    echo ::::: creating the app folders :::::

    rem setting the base to create app folder %1
    call :setbase %~1
    mkdir %~2
    exit /b 0

endlocal

这是我启动deploy.bat时得到的输出


*********************************************
   Deploying in production mode: 19:28:53.13
       Deploy path: C:/wamp64/www/test
*********************************************
::::: checking for local web server destination :::::
::::: setting up base :::::
0
::::: creating the app folders :::::
::::: setting up base :::::
A subdirectory or file test already exists.

好像是If_旗帜 ==0,正在检查应用文件夹是否存在于服务器根目录中,并且根本不工作。当我学会如何将参数传递给其他函数时;我认为它传递的是一个类似于指针的引用,但它似乎与作用域紧密相连。代码里发生了什么。


共有1个答案

水昊阳
2023-03-14

您用来验证目录(?)是否正确的代码存在就是

set %~3= dir /p|find /C "%~2"

我认为这不是你想要的SET/P经常这样使用,以便将命令的输出传输到环境变量中。(不过,您正在将/P赋给dir,这可能不是您想要的结果。)不过,你的命令不会这么做。我猜这项工作的目的是将var设置为(字面上的)“dir/p”,然后通过find count实现。这是查找的结果。exe/C但永远不要回到envvar中。输出行“0”是管道(无)通过find的结果。exe/C

我提出一个更简单的生存测试:

IF EXIST "%~2" (SET /A %~3=1) ELSE (SET /A %~3=0)

这个测试在我的Win10机器上运行。

我已经看到了IF EXIST工作方式的一些差异。如果不想使用它,可以使用FOR循环。

FOR /F "tokens=*" %%e IN ('DIR /B') DO IF "%%~e"=="%~2" SET /A %~3=1

如果您想在FOR命令中使用管道,您必须转义它。

FOR /F "tokens=*" %%e IN ('DIR /B ^| find /C "%~2"') DO SET /A %~3=%%~e

这三种方法对我都有效。

我认为除了内置的帮助(SETLOCAL/?)之外,没有关于cmd语法的官方参考指南

我的经验是,它将所有的EnvVar和工作目录推到一个“堆栈”上,相应的ENDLOCALEXIT(尽管在脚本中,您几乎总是希望使用EXIT/B)将弹出该“堆栈”中的环境实际上,这意味着您在SETLOCAL中所做的envvar/CWD更改将只是暂时的。

 类似资料:
  • 问题内容: 在Go中,如何将函数调用返回的值分配给指针? 考虑下面的示例,注意返回一个值(不是指针): 这些都失败了: 是否确实需要局部变量?那不会招致不必要的复制吗? 问题答案: 根据规范,必须使用局部变量。 要获取值的地址,调用函数必须将返回值复制到可寻址的内存中。有副本,但这不是多余的。 Go程序通常使用值。 有时在应用程序想要区分无值和其他时间值的情况下使用A。在SQL NULL和有效时间

  • 在rust中,任何函数都有返回类型,当函数返回时,会返回一个该类型的值。我们先来看看main函数: fn main() { //statements } 之前有说过,函数的返回值类型是在参数列表后,加上箭头和类型来指定的。不过,一般我们看到的main函数的定义并没有这么做。这是因为main函数的返回值是(),在rust中,当一个函数返回()时,可以省略。main函数的完整形式如下:

  • 我正在使用一个bash脚本,我想执行一个函数来打印返回值: 当我执行时,它不会打印“34”。为什么会这样呢?

  • 主要内容:函数定义函数是组织在一起执行特定任务的一组语句。 在批处理脚本中,采用类似的方法将逻辑语句组合在一起形成一个函数。 像其他语言一样,批处理脚本中的函数也遵循相同的程序规则 - 函数声明 - 它告诉编译器一个函数的名字,返回类型和参数。 函数定义 - 它提供了函数的实际主体。 函数定义 在批处理脚本中,通过使用标签语句来定义函数。 当一个函数被重新定义时,它可能会将一个或多个值作为函数的输入“参数”,并在函

  • 本章目录 1. 一个特殊的参数:return_value 2. 引用与函数的执行结果 3. 小结 PHP语言中函数的返回值是通过return来完成的,就像下面的程序: <?php function sample_long() { return 42; } $bar = sample_long(); C语言也一样使用return关键字 int sample_long(void) { r

  • 4.2.6 函数的返回值 函数作为一种模块构件,它与其他模块如何协作、交换信息?我们已经知道,通过函数 调用时的参数传递,可以实现从函数外部向函数内部输入数据。本节讨论函数向外部输出信 息的问题。 在数学中,函数是从定义域到值域的映射,亦即从自变量计算出函数值。编程语言中的 函数原本就是数学函数的模仿物,自然也可以计算出一个结果输出给函数调用者,我们称函 数输出的计算结果为函数的返回值(retur