Как установить динамический путь к папке в переменной в Batch File? - PullRequest
0 голосов
/ 24 июня 2019

Я пишу скрипт для резервного копирования моей базы данных 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%

Следующая строка работает на заметку.

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...]

Как видите, переменная DIR пуста

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Согласно моему комментарию…

Основная проблема с вашим кодом заключается в том, что вы не следовали инструкциям по использованию команды 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 зависят от локали / ПК / пользователя.Я бы посоветовал вам использовать метод, которого нет, поэтому предложите решение, которое вместо этого использует 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%"
0 голосов
/ 25 июня 2019

Попробуйте следующее, это работает, как и ожидалось для меня.

Я подозреваю, что у вас есть пробел в исходном методе, и это просто берет ваш код, удаляя лишние части и используя кавычки вокруг переменных, чтобы убедиться, что этого не происходит.

@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.

Примечание: я изменил код, чтобы больше не полагаться на дату, являющуюся определенным форматом, чтобы код работал на моем компьютере так же, как и на вашем, так как я использую другой формат даты, чем вы, так что я чувствовал, что лучше разместить код, который должен работать для любого из нас.

Извините, похоже, что я оставил это в середине редактирования, когда вышел вчера и не опубликовал его в то время.

Надеюсь, это поможет! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...