Программа jq .dev.projects."$v"
в вашем примере будет буквально пытаться найти ключ с именем "$v"
. Вместо этого попробуйте следующее:
jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json
@echo off
setlocal
set "source=D:\test"
set "destination=D:\test"
set "dirs="." "fullbackup" "diffbackup""
set "passwd=Qwerty"
set "dd=%DATE:~0,2%"
set "mm=%DATE:~3,2%"
set "yyyy=%DATE:~6%"
set "hh=%TIME:~0,2%"
set "mn=%TIME:~3,2%"
set "ss=%TIME:~6,2%"
set "curdate=%dd%-%mm%-%yyyy%-%hh%-%mn%-%ss%"
set "logfile=%cd%\log.tmp"
REM Make the logfile if not exist.
if not exist "%logfile%" 1> nul 2> "%logfile%" echo.
REM Make ftp file.
set "ftp_host=127.0.0.1"
set "ftp_username=test"
set "ftp_pass=test"
set "file_transport=transport.txt"
set "ftp_root=/"
(
echo open %ftp_host%
echo user %ftp_username% %ftp_pass%
echo binary
) > "%file_transport%"
REM Zip files.
set "zipped=0"
for %%A in (%dirs%) do if exist "%source%\%%~A" (
set "setdir="
for %%B in ("%source%\%%~A\*") do if /i not "%%~xB" == ".7z" (
"C:\Program Files\7-Zip\7z.exe" a -ssw -mx9 -p"%passwd%" "%destination%\%%~A\%%~nxB_%curdate%.7z" "%%~fB" -sdel
if not errorlevel 1 (
set /a "zipped+=1"
>> "%logfile%" echo zip "%%~A\%%~nxB_%curdate%.7z".
if not defined setdir (
set "setdir=1"
if not "%%~A" == "." echo mkdir "%ftp_root%/%%~A"
echo cd "%ftp_root%/%%~A"
echo lcd "%destination%\%%~A"
)
echo put "%%~nxB_%curdate%.7z"
) >> "%file_transport%"
)
)
>> "%file_transport%" echo bye
REM Send to FTP server by cmd ftp.
if %zipped% equ 0 (
>> "%logfile%" echo zip no files for "%curdate%".
) else (
ftp -v -n -i -s:"%file_transport%"
if errorlevel 1 (
>> "%logfile%" echo ftp error %errorlevel%.
) else >> "%logfile%" echo ftp success.
)
del "%file_transport%"
REM Delete old files older than N days.
for %%A in (%dirs%) do if exist "%destination%\%%~A\*.7z" (
pushd "%destination%\%%~A" && (
echo CD: "%destination%\%%~A"
forfiles /d -30 /m *.7z /c "cmd /c del @file"
popd
)
)
REM Email the log content.
if not exist "%logfile%" exit /b 0
set command=^&{$usr= 'mylogon';^
$pwd= ConvertTo-SecureString -String 'mypassword' -AsPlainText -Force;^
$cred= New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $usr, $pwd;^
$body= Get-Content -LiteralPath '%logfile%' -Raw;^
Send-MailMessage -To 'mymail' -From 'mymail' -Subject 'Log' -SmtpServer 'smtp.mail.ru' -Port 587 -Credential $cred -UseSSL -Body $body}
Powershell -Command "%command%"
REM Merge or rename .tmp file to .txt file.
for %%A in ("%logfile%") do (
if "%%~xA" == ".tmp" (
if exist "%%~nA.txt" (
type "%%~A" >> "%%~nA.txt"
del "%%~A"
) else ren "%%~A" "%%~nA.txt"
)
)
exit /b 0
Ввод даты и времени, когда вы используете mm
для месяца и mm
для минуты. Теперь используйте mn
в течение нескольких минут, чтобы разделить значения.
Все файлы, кроме файлов .7z, будут индивидуально заархивированы и доступны для ftp
.
В переменной zipped
хранится количество архивов файлов, поэтому команда ftp
выполняется, только если значение zipped
больше, чем 0
.
transport.txt
содержимое будет вставлено несколько раз, а не все сразу. Это делается для того, чтобы каждый каталог и файл могли обрабатываться отдельно.
Циклы for
теперь могут выполнять итерацию списка каталогов для архивирования файлов *.7z
. Команды ftp
put
будут отображаться в transport.txt
с каждым архивированным файлом.
Упрощенная запись в файл %file_transport%
. При необходимости вставьте mkdir
, чтобы убедиться, что удаленный каталог создан до того, как произойдет cd
.
forfiles
теперь используется в каждом каталоге, указанном в переменной dirs
.
Переменная dirs
содержит список имен каталогов, через которые необходимо выполнить итерацию. .
- это текущий каталог, то есть корень пути source
.
powershell
отправит текстовое содержимое logfile
по электронной почте с помощью командлета Send-MailMessage . Он не отправит, если путь переменной logfile
не существует.
Если расширение файла журнала равно .tmp
, оно будет переименовано с расширением .txt
, если оно не существует, в противном случае будет объединено с файлом .txt
и файл .tmp
будет удален. Это делается в конце сценария. Использование расширения .tmp
позволяет powershell
отправлять по электронной почте содержимое в файле .tmp
, а не в больший файл .txt
.