我编写此代码是为了能够轻松地在我的 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...
#
********************************************************************************
观察:该任务无需定义系统变量,也无需在运行时更新其值,需要很多命令来组成名称的布局,我不能说可以移植到可以在同一会话中使用实时更新值/字符串的单行/变量...