我正在编写一个脚本来备份我的mongoDB数据库。备份工作正常,但是以某种方式我无法正确设置文件夹位置。
- name: restart pulse audio
shell: '$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)'
args:
executable: /bin/bash
become: true
become_method: sudo
become_flags: "su - {{ ansible_become_user }} -c"
@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%
变量set 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...]
为空
答案 0 :(得分:0)
请尝试以下操作,这对我来说是预期的。
我怀疑您的原始方法中有一个空格,这只是要将代码删除多余的部分,并在变量周围使用引号来确保它没有发生。
@ECHO OFF
SET "_UN=YourUserName"
SET "_PW=YourPassword"
SET "_MongoDBIPPort=127.0.0.1:27017"
SET "_MongoDB=DW"
SET "_MongoBackupRoot=D:\MongoDB\db_backup"
FOR /F "Tokens=1-7 delims=MTWFSmtwfsouehrandit:-\/. " %%A IN ("%DATE% %TIME: =0%") DO (
FOR /F "Tokens=2-4 Skip=1 Delims=(-)" %%a IN ('ECHO.^| DATE') DO (
SET "%%~a=%%~A" & SET "%%~b=%%~B" & SET "%%~c=%%~C" & SET "HH=%%~D" & SET "Mn=%%~E" & SET "SS=%%~F" & SET "Ms=%%~G"
)
)
SET "_PrintTime=%yy%-%mm%-%dd%_%HH%.%Mn%"
ECHO(_PrintTime = "%_PrintTime%"
SET "_Dest=%_MongoBackupRoot%\%_PrintTime%"
ECHO(Dest Directory = "%_Dest%"
IF NOT EXIST "%_Dest%" (
MD "%_Dest%"
)
mongodump -h %_MongoDBIPPort% -d %_MongoDB% -u %_UN% -p %_PW% -o "%_Dest%"
由于您的原始代码没有给我您遇到的问题,因此再次导致您相信您的变量声明中可能存在一些错误的空格,或者我无法通过Stack Exchange接收到其他不可打印的字符。
注意:我将代码更改为不再依赖于特定格式的日期,以便该代码在您的计算机上与您的计算机一样运行,因为我使用的日期格式与您使用的日期格式不同,所以我觉得更好发布适合我们中任何一个的代码。
对不起,我昨天赶出时似乎没有进行编辑,而当时还没有发布。
希望有帮助! :)
答案 1 :(得分:0)
根据我的评论...
您的代码的主要问题是您没有遵循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%"