Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 将函数的值返回给批处理脚本中的函数_Windows_Batch File_Cmd_Scope - Fatal编程技术网

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

Windows 将函数的值返回给批处理脚本中的函数,windows,batch-file,cmd,scope,Windows,Batch File,Cmd,Scope,这可能是SO、dostips和ss64中几个问题的重复。我所做的研究告诉我要注意函数中的作用域。但我的解决方案简单明了,但问题依然存在 SETLOCAL和ENDLOCAL 如何在批处理脚本ex(goto)2>nul中工作 为什么(转到)用大括号括起来(在中解释) 这是我迄今为止编写的将文件从一个地方复制到另一个地方的代码。 我的目标是: 研究批处理脚本的范围和上下文 代码重用 好像是If_旗帜==0,正在检查应用程序文件夹是否存在于服务器根目录中,并且根本不工作。当我学会如何将参数传递给其他

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

  • SETLOCAL
    ENDLOCAL
  • 如何在批处理脚本ex
    (goto)2>nul中工作
  • 为什么
    (转到)
    用大括号括起来(在中解释)
  • 这是我迄今为止编写的将文件从一个地方复制到另一个地方的代码。 我的目标是:

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

    检查文件/Dir是否存在 您用来验证目录(?)是否存在的代码是

    set %~3= dir /p|find /C "%~2"
    
    我认为这不是你想要的。
    SET/P
    通常这样使用,以便将命令的输出通过管道传输到环境变量中。(不过,您正在将
    /P
    赋给
    dir
    ,这可能不是您想要的结果。)不过,您使用的命令不会这样做。我猜这是在将var设置为(字面上的)“dir/p”,然后通过find count进行管道传输。但是,
    find.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 我认为除了内置的帮助(
    SETLOCAL/?
    )之外,没有关于cmd语法的官方参考指南


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

    中:检查
    ,当您设置
    \u标志时,您实际上并没有运行该命令,而是将该变量设置为文本字符串。使用
    for/F
    将命令输出存储在变量中。请注意,它是
    %~dp0
    ,而不是
    %~dp0%
    尽管在脚本中,您几乎总是希望使用EXIT/B
    。这是因为如果函数末尾未定义
    exist/b
    ,通常的执行流将继续自上而下,最终可能以递归结束,并达到
    最大递归深度。此技巧
    if exist“%~2”(SET/a%~3=1)ELSE(SET/a%~3=0)
    解决了问题。
    FOR /F "tokens=*" %%e IN ('DIR /B') DO IF "%%~e"=="%~2" SET /A %~3=1
    
    FOR /F "tokens=*" %%e IN ('DIR /B ^| find /C "%~2"') DO SET /A %~3=%%~e