batch-file - 如何在批处理文件中设置变量的动态文件夹路径?

标签 batch-file cmd

我正在编写一个脚本来备份我的 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/

相关文章:

command-line - 使用命令行在文件中查找 2 个值 |指令

windows - 无需按回车即可获取用户输入

batch-file - 批处理文件从上次修改的文件夹中获取文件

batch-file - 通过批处理脚本从 .CSV 中删除行

command-line - 批处理文件 : copy all file except those its name contain some substring

variables - 批处理文件不保留变量

windows - 批处理脚本 if else 命令

windows - .bashrc 等效于 Windows cmd shell?

vb6 - 帮助 ffmpeg

Java "Could not find or load main class"(路径和类路径已设置)