这可能是SO、dostips和ss64中几个问题的重复。我所做的研究告诉我要注意函数中的作用域。但我的解决方案简单明了,但问题依然存在
SETLOCAL
和ENDLOCAL
上下文
如何在批处理脚本中工作,例如(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,正在检查应用文件夹是否存在于服务器根目录中,并且根本不工作。当我学会如何将参数传递给其他函数时;我认为它传递的是一个类似于
指针的引用,但它似乎与
作用域
紧密相连。代码里发生了什么。
您用来验证目录(?)是否正确的代码存在就是
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和工作目录推到一个“堆栈”上,相应的ENDLOCAL
或EXIT
(尽管在脚本中,您几乎总是希望使用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