我正在编写一个脚本来备份我的 mongoDB 数据库。备份工作正常,但不知何故我无法正确设置文件夹位置。
下面是我的脚本
@echo on
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a)
set print_time = %mydate%_%mytime%
set DIR=%print_time%
set DEST=D:\MongoDB\db_backup\%DIR%
mkdir %DEST%
mongodump -h 127.0.0.1:27017 -d DW -u [user]-p [password] -o %DEST%
以下行是注释工作。
设置 DIR=%print_time%
变量DIR
为空
上述脚本的输出
D:\MongoDB>mongoBackup.cmd
D:\MongoDB>For /F "tokens=2-4 delims=/ " %a in ('date /t') do (set
mydate=%c-%a-%b )
D:\MongoDB>(set mydate=2019-06-24 )
D:\MongoDB>For /F "tokens=1-2 delims=/:" %a in ('time /t') do (set mytime=%a
)
D:\MongoDB>(set mytime=04 )
D:\MongoDB>set print_time = 2019-06-24_04
D:\MongoDB>set DIR=
D:\MongoDB>set DEST=D:\MongoDB\db_backup\
D:\MongoDB>mkdir D:\MongoDB\db_backup\
A subdirectory or file D:\MongoDB\db_backup\ already exists.
D:\MongoDB>mongodump -h 127.0.0.1:27017 -d DW -u [user]-p [password]-o
D:\MongoDB\db_backup\
[BACKUP INFOS...]
如您所见,变量 DIR
为空
最佳答案
根据我的评论......
您的代码的主要问题是您没有遵循 Set
的使用指南命令。打开命令提示符窗口并输入 set /?
,应该足以学习如何使用该命令,从输出。
当前您的变量是 %print_time %
不是%print_time%
,因为 =
两侧都有空格 包含在变量名称和值中。实际上你需要改变set print_time = %mydate%_%mytime%
至set print_time=%mydate%_%mytime%
.
此外,最佳做法是使用引号来保护字符串中的空格和其他“有毒”字符。当涉及到设置变量时,推荐的语法是 Set "VariableName=Variable Value"
,所以你应该使用 Set "print_time=%mydate%_%mytime%"
。此外,虽然提供的路径不是必需的,但将变量 %DIR%
括起来会更安全。也用引号引起来,(这意味着目标路径中的任何更改,可能引入空格或与号,都不会影响代码的其余部分)。因此,您应该在 MkDir
中执行此操作和mongodump
命令行,因此:
@Echo Off
For /F "Tokens=2-4Delims=/ " %%A In ('Date /T')Do Set "MyDate=%%C-%%A-%%B"
For /F "Delims=:" %%A In ('Time /T')Do Set "MyTime=%%A"
Set "print_time=%MyDate%_%MyTime%"
Set "DIR=%print_time%"
Set "DEST=D:\MongoDB\db_backup\%DIR%"
MkDir "%DEST%" 2>NUL
mongodump -h 127.0.0.1:27017 -d DW -u [user] -p [password] -o "%DEST%"
您用于创建日期和时间字符串的方法不是很可靠,因为 Date
的结果和Time
与他们的/T
选项取决于区域设置/PC/用户。我建议您使用一种不是的方法,因此提供一个使用 RoboCopy
的解决方案反而。此外,以下仅定义了实现目标的一个变量,而不是五个:
@Echo Off
Set "DEST="
For /F "Tokens=1-4Delims=/: " %%A In ('RoboCopy /NJH /L "\|" Null')Do If Not Defined DEST Set "DEST=D:\MongoDB\db_backup\%%A-%%B-%%C_%%D"
If Not Defined DEST GoTo :EOF
MD "%DEST%" 2>NUL
mongodump -h 127.0.0.1:27017 -d DW -u [user] -p [password] -o "%DEST%"
关于batch-file - 如何在批处理文件中设置变量的动态文件夹路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56743831/