这可能是 SO、dostips 和 ss64 中的几个问题的重复。我所做的研究指出,需要在函数中注意 _scope_,但我的解决方案简单直接,但问题仍然存在。
SETLOCAL
和ENDLOCAL
的真正含义是什么context
在批处理脚本中如何工作,例如:(goto) 2>nul
(goto)
包含在大括号中的原因(在 dostips 中有解释)
以下是我编写的代码,用于将文件从一个位置复制到另一个位置。
- 研究批处理脚本的
scope
和context
- 代码重用
@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 部署在 %~1 模式下: %TIME% echo 部署路径: !^_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 ::::: 设置基础目录 ::::: chdir /D C:
rem 为应用程序设置基本目录 => %1 chdir %~1 exit /b 0
:check echo ::::: 检查本地Web服务器目标 ::::: call :setbase %~1
set %~3= dir /p|find /C "%~2" exit /b 0
:create echo ::::: 创建应用程序文件夹 :::::
rem 将基础设置为创建应用程序文件夹 %1 call :setbase %~1 mkdir %~2 exit /b 0
endlocal
deploy.bat
时得到的输出:
********************************************* 以生产模式部署: 19:28:53.13 部署路径:C:/wamp64/www/test ********************************************* ::::: 检查本地 Web 服务器目标 ::::: ::::: 设置基础 ::::: 0 ::::: 创建应用程序文件夹 ::::: ::::: 设置基础 ::::: 子目录或文件 test 已经存在。看起来
If !_flag!
==0,它检查服务器根目录中是否存在应用程序文件夹,但根本不起作用。当我学习如何将参数传递给其他函数时,我认为它像引用一样传递pointer
,但它似乎与scope
紧密相关。那么在代码中发生了什么?
:check
中,当你设置_flag
时,实际上并没有运行命令,而是将该变量设置为字面字符串。使用for /F
将命令输出存储到变量中。 - SomethingDark%~dp0
,而不是%~dp0%
! - double-beep