首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将动态文件夹路径设置为批处理文件中的变量?

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

Stack Overflow用户
提问于 2019-06-24 20:55:14
回答 2查看 7K关注 0票数 2

我正在编写一个脚本来备份我的mongoDB数据库。备份工作正常,但不知怎的,我无法正确设置文件夹位置。

下面是我的剧本

代码语言:javascript
复制
@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为空

来自上述脚本的输出

代码语言:javascript
复制
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为空

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-25 11:08:22

根据我的评论,…

代码的主要问题是您没有遵循使用Set命令的指导。打开命令提示符窗口并输入set /?,应该足够学习如何从输出中使用该命令。

目前,您的变量是%print_time %而不是%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命令行中这样做,因此:

代码语言:javascript
复制
@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选项的结果依赖于Locale/PC/User。我建议您使用一种不是的方法,所以提供一个使用RoboCopy的解决方案。此外,以下仅定义了实现目标的一个变量,而不是五个变量:

代码语言:javascript
复制
@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%"
票数 2
EN

Stack Overflow用户

发布于 2019-06-24 21:38:50

按照我的预期,尝试下面的工作方式。

我怀疑您的原始方法中有一个空间,这只是将您的代码删除多余的部分,并在变量周围使用引号,以确保它不会发生。

代码语言:javascript
复制
@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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56743831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档