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

时间:2019-06-24 20:55:14

标签: batch-file cmd

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

2 个答案:

答案 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%括在引号中,(这意味着目标路径中的任何更改(可能引入空格或&符都不会影响)其余代码)。因此,您应该在MkDirmongodump命令行中这样做,因此:

@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%"

您用于创建日期和时间字符串的方法不是很可靠,因为DateTime及其/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%"