Почему мой пакетный скрипт для загрузки на AWS не работает?

Вопрос или проблема

Я написал пакетный скрипт, который:

  • Создает имя файла на основе сегодняшней даты.
  • Сжимает папку с файлами в 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://"&lt;&lt;MY BUCKET&gt;&gt;/%_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%/"

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

Оцените материал
Добавить комментарий

Капча загружается...