我可以将我的代码转换为全局环境变量吗?

我可以将我的代码转换为全局环境变量吗?

我编写此代码是为了能够轻松地在我的 SSD 和 HD 之间移动目录,并且还可以轻松地在我的 robocopy 日志文件中输出时间戳,它工作得很好,所以我想将我的时间戳 &z& 变量变成一个全局变量,这样当我使用这样的命令行时,我可以使用它来输出带有这个时间戳的日志文件:

"File Organizer.bat" > C:\Logs\log%z%.log 2>&1

这样生成的日志文件将如下所示:

log_05.10.2021_02.55.log

我的 robocopy 批处理文件如下:

cls
Color 03

@echo off

:: Adapting timestamps for use in file formats
:: Change the z set to fit your locale

set t=%date%_%time%
set z=%t:~0,2%.%t:~3,2%.%t:~6,4%_%t:~11,2%.%t:~14,2%
set z=%z: =0%

:: Setting Variables
:: Change the variables to fit your needs

set _source="C:\Folder01"

set _dest="D:\Folder02"

set _opt=/E /MOVE /R:2 /W:1

SET _log=/LOG:"D:\ROOT\Logs\log_%z%.txt" /TEE /NP

@echo.
@echo *******************************************************************************
@echo #                                                                             
@echo # This CMD moves a folder to another place and makes a Symbolic link to it
@echo #                                                                             
@echo # Robocoping %_source%  
@echo #                                                                             
@echo # to %_dest%
@echo #                                                                             
@echo # With Parameters %_opt%
@echo #                                                                             
@echo # Logging %_log%
@echo #                                                                             
@echo *******************************************************************************
@echo.
pause

:: Creating Destination Directory

MD %_dest%

:: Moving/Copying the files/folders

ROBOCOPY %_source% %_dest% %_opt% %_log%

:: Creating Symbolic Link

MKLINK /D %_source% %_dest%

@echo.
@echo *******************************************************************************
@echo #                                                                             
@echo # Job Completed...
@echo #                                                                             
@echo *******************************************************************************
@echo.

pause

答案1

  • 在 中Search搜索并选择:System (Control Panel)
  • 单击该Advanced system settings链接。
  • 单击Environment Variables。在此部分中,您可以设置始终处于活动状态的用户或计算机范围变量。

答案2

您必须先运行另一个批处理文件来设置环境变量。

将日期行复制到新的批处理文件中,例如LogDate.bat

set t=%date%_%time%
set z=%t:~0,2%.%t:~3,2%.%t:~6,4%_%t:~11,2%.%t:~14,2%
set z=%z: =0%
setx z %z%

然后你应该能够在其余命令之前运行它

LogDate.bat && "File Organizer.bat" > C:\Logs\log%z%.log 2>&1

答案3

  • 考虑,或者记住...

由于 SETX 将变量写入注册表中的主环境,因此只有在打开新命令窗口时编辑才会生效 - 它们不会影响当前 CMD 或 PowerShell 会话。

调用你的 bat,如果没有传递参数,则定义你的变量并再次调用你的 bat(自己调用),这次传递它们已经重定向到具有所需名称、定义和当前日期/时间的日志文件...

@echo off 

setlocal enabledelayedexpansion

if "%~1"=="" (

     color 03
     mode 100,27
     
     cd /d "%~dp0"
     
     set "_sources=C:\Folder01"
     set "_destiny=D:\Folder02"
     
     set "_opt=/E /MOVE /R:2 /W:1"
     set "_log=/LOG:"D:\ROOT\Logs\!!_log!!.txt" /TEE /NP"
     
     for /f %%i in ('wmic OS Get localdatetime^|find "."')do set _dt=%%i
     set "_log=log_!_dt:~6,2!_!_dt:~4,2!_!_dt:~0,4!_!_dt:~8,2!_!_dt:~10,2!"
     
     echo\ Outputs Files: Log %~nx0 !_log!.log ^& RoboCopy.exe "!_log!.txt" 
     
     call "%~f0" "!_sources!" "!_destiny!" "!_opt!" "!_log!.txt" >"!_log!.log"
     
     exit /b )else endlocal

echo\
echo\ ********************************************************************************
echo\ #                                                                             
echo\ # This CMD moves a folder to another place and makes a Symbolic link to it
echo\ #                                                                             
echo\ # Robocoping %~1
echo\ #                                                                             
echo\ # to %~2
echo\ #                                                                             
echo\ # With Parameters %~3
echo\ #                                                                             
echo\ # Logging %~4
echo\ #                                                                             
echo\ ********************************************************************************

mkDir %~2

:: Moving/Copying the files/folders

RoboCopy %~1 %~2 %~3 %~4

:: Creating Symbolic Link

mkLink /D %~1 %~2 

echo\
echo\ ********************************************************************************
echo\ #                                                                             
echo\ # Job Completed...
echo\ #                                                                             
echo\ ********************************************************************************

  • 文件中的输出log_11_10_2021_12_53.log
 ********************************************************************************
 #                                                                             
 # This CMD moves a folder to another place and makes a Symbolic link to it
 #                                                                             
 # Robocoping C:\Folder01
 #                                                                             
 # to D:\Folder02
 #                                                                             
 # With Parameters /E /MOVE /R:2 /W:1
 #                                                                             
 # Logging log_11_10_2021_12_53.txt
 #                                                                             
 ********************************************************************************
 mkDir D:\Folder02
 RoboCopy C:\Folder01 D:\Folder02 /E /MOVE /R:2 /W:1 log_11_10_2021_12_53.txt
 mkLink /D C:\Folder01 D:\Folder02 

 ********************************************************************************
 #                                                                             
 # Job Completed...
 #                                                                             
 ********************************************************************************

观察:该任务无需定义系统变量,也无需在运行时更新其值,需要很多命令来组成名称的布局,我不能说可以移植到可以在同一会话中使用实时更新值/字符串的单行/变量...

相关内容