Вопрос или проблема
Я написал пакетный скрипт, который:
- Создает имя файла на основе сегодняшней даты.
- Сжимает папку с файлами в ZIP-архив.
- Создает папку в моем AWS-бакете (если необходимо).
- Загружает ZIP-архив.
Вот что у меня есть:
for /f "tokens=1-4 delims=/ " %%i in ("%date%") do (
set month=%%j
set day=%%k
set year=%%l
)
set zipstr=D:\Daily\fms25_daily_%year%-%month%-%day%.zip
set folderstr=%year%-%month%-%day%
"C:\Program Files\7-Zip\7z.exe" a %zipstr%
# создаем ежедневную папку, если необходимо
aws s3api put-object --bucket fmsbackupslts --key %folderstr%/ --content-length 0
# загружаем в S3
set AWS_ACCESS_KEY_ID=<<MY ID>>
set AWS_SECRET_ACCESS_KEY=<<MY KEY>>
set AWS_DEFAULT_REGION=us-east-2
aws s3 sync %zipstr% s3://<<MY BUCKET>>/%folderstr%/
Я получаю ошибку, в которой говорится, что файл не существует, но я знаю, что он создается правильно.
@echo off & setlocal
cd /d "%~dp0" & Rem // Или укажите папку
Rem // :: где находится исполняемый файл:
Rem // :: cd /d "D:\Full\Path\To\asw.exe"
for /f "tokens=1-4 delims=/ " %%i in ("%date%") do (
set "_mm=%%~j"
set "_dd=%%~k"
set "_yr=%%~l"
)
set "_zipstr=D:\Daily\fms25_daily_%_yr%-%_mm%-%_dd%.zip"
set "_folderstr=%year%-%month%-%day%"
"C:\Program Files\7-Zip\7z.exe" a "%_zipstr%"
# создаем ежедневную папку, если необходимо
aws s3api put-object --bucket fmsbackupslts --key "%_folderstr%/" --content-length 0
# загружаем в S3
set "_AWS_ACCESS_KEY_ID=<<MY ID>>"
set "_AWS_SECRET_ACCESS_KEY=<<MY KEY>>"
set "_AWS_DEFAULT_REGION=us-east-2"
aws s3 sync %zipstr% s3://"<<MY BUCKET>>/%_folderstr%/"
Не зная, какие символы используются в определении и требуют ли некоторые экранирования, я предполагаю, что наиболее вероятной причиной является приоритет предотвращения непредсказуемого поведения путем обеспечения предсказуемых результатов с использованием двойных кавычек. В качестве лучшей практики при определении переменных, финальный код будет следовать вышеуказанному предложению, обеспечивая как ясность, так и защиту от неожиданных поведений.
Используя эту обновленную версию и сталкиваясь с ошибкой, замена @echo
на off@echo on
может помочь выявить строку или команду, где возникает текущая ошибка. В этом случае дополнительное редактирование вашего запроса может помочь предоставить более точное корректирующее действие, обеспечивая, что отладка будет как точной, так и эффективной.
Примечание: Очевидно, что у меня нет возможности воспроизвести точно такой же сценарий с точно такими же элементами, и я не в курсе, какие значения задаются в ваших переменных и также вызываю ваш скрипт в командной строке с 2>&1 Script.bat
или, если применимо, 2>&1 Script.cmd
.
Некоторые дальнейшие чтения:
Ответ или решение
Ваш скрипт для загрузки в AWS может не работать по нескольким причинам. Давайте проанализируем ваш код и выявим возможные проблемы.
1. Проблемы с переменными
Вы используете переменные в вашем скрипте, но они неправильно инициализируются в некоторых местах:
set "_folderstr=%year%-%month%-%day%"
В этом случае переменные year
, month
и day
не определены в блоке for
, поскольку они объявлены с использованием set month=%%j
и т.д. Вместо этого вы должны использовать:
set "_folderstr=%_yr%-%_mm%-%_dd%"
2. Убедитесь, что файл ZIP создается
Перед попыткой загрузки файла на AWS, убедитесь, что ZIP-файл фактически создается. Можете добавить проверку:
if not exist "%_zipstr%" (
echo Файл не найден: %_zipstr%
exit /b 1
)
Это поможет вам убедиться, что следующий шаг скрипта выполняется только если файл действительно существует.
3. Проблемы с командой AWS CLI
В вашей команде aws s3 sync
можно заметить, что вы передаете в нее неправильные аргументы:
aws s3 sync %zipstr% s3://"<<MY BUCKET>>/%_folderstr%/"
Эта команда предназначена для синхронизации каталогов, поэтому для загрузки файла нужно использовать aws s3 cp
:
aws s3 cp "%_zipstr%" "s3://<<MY BUCKET>>/%_folderstr%/"
4. Правильное использование переменных окружения AWS
Убедитесь, что ваши переменные AWS правильно инициализированы и доступны для команд AWS CLI. Можно сделать это следующим образом:
set AWS_ACCESS_KEY_ID=<<MY ID>>
set AWS_SECRET_ACCESS_KEY=<<MY KEY>>
set AWS_DEFAULT_REGION=us-east-2
Эти строки устанавливают переменные окружения, и они должны быть доступны для программы AWS CLI. Убедитесь, что они содержат правильные значения.
5. Вывод ошибок
Если после внесения всех исправлений возникнули новые ошибки, вы можете заменить @echo off
на @echo on
, чтобы видеть больше информации о том, где ваш скрипт может сбойнуть.
Обновленный скрипт
С учетом всех упомянутых изменений ваш скрипт будет выглядеть примерно так:
@echo off & setlocal
cd /d "%~dp0"
for /f "tokens=1-4 delims=/ " %%i in ("%date%") do (
set "_mm=%%~j"
set "_dd=%%~k"
set "_yr=%%~l"
)
set "_zipstr=D:\Daily\fms25_daily_%_yr%-%_mm%-%_dd%.zip"
set "_folderstr=%_yr%-%_mm%-%_dd%"
"C:\Program Files\7-Zip\7z.exe" a "%_zipstr%"
if not exist "%_zipstr%" (
echo Файл не найден: %_zipstr%
exit /b 1
)
aws s3api put-object --bucket fmsbackupslts --key "%_folderstr%/" --content-length 0
set AWS_ACCESS_KEY_ID=<<MY ID>>
set AWS_SECRET_ACCESS_KEY=<<MY KEY>>
set AWS_DEFAULT_REGION=us-east-2
aws s3 cp "%_zipstr%" "s3://<<MY BUCKET>>/%_folderstr%/"
Пожалуйста, проверьте, исправлены ли все описанные проблемы, и выполните скрипт заново. Если возникнут дополнительные ошибки, обратите внимание на сообщения об ошибках и при необходимости уточните их для дальнейшей помощи.