Общая форма команды curl в CMD, которая работает:

curl -o latest.dump -L " https://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/xxxx.dump?AWSAccessKeyId=AKIAJSCBEZJRDOTGNGZQ&Expires=1411489500&Signature=%2F5zwQNX2N40022244

Но URL-адрес генерируется динамически, поэтому для меня, чтобы поместить это в сценарий .bat. ОК, нет проблем, вот мой сценарий .bat, который на бумаге должен работать.

@echo off

for /f "delims=" %%a in ('heroku pgbackups:url') do @set this_url=%%a
ECHO %this_url%
curl -v -o latest.dump -L %this_url%

Но выход выдает залог, потому что при первом '&', как вы могли ожидать. Эхо this_url показывает полную строку с кавычками. Как я могу добавить или заставить заключить эту строку в кавычки?

Я пытался, но он возвращает тот же тип ошибки:

cmd /k ""curl -v -o latest.dump -l" "('heroku pgbackups:url')""

Некоторые могут спросить, почему бы не сделать это в Unix или CYGWIN? Я сделал это первым. Команда отлично работает на моем OS X персональном компьютере. Так должно работать в CYGWIN? Ну, я получаю ошибки того же типа.

Я попытался включить сценарий Perl с помощью библиотеки uri_escape и вставил его. Но URL, который он передает, не распознается curl.

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

Вывод heroku pgbackups:url в консоли CMD:

"https://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccess
KeyId=AKIAJSCBEZJRDOTGNGZQ&Expires=1411657655&Signature=MqzqBitAN7MADiLAsdAN4ZQk
RH0%3D"

Вывод файла .bat выше:

https://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccessK
eyId=AKIAJSCBEZJRDOTGNGZQ
'Expires' is not recognized as an internal or external command,
operable program or batch file.
'Signature' is not recognized as an internal or external command,
operable program or batch file.
* About to connect() to s3.amazonaws.com port 443 (#0)
*   Trying 205.251.243.66...   % Total    % Received % Xferd  Average Speed   Ti
me    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0co
nnected
* Connected to s3.amazonaws.com (205.251.243.66) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Server hello (2):
{ [data not shown]
* SSLv3, TLS handshake, CERT (11):
{ [data not shown]
* SSLv3, TLS handshake, Server finished (14):
{ [data not shown]
* SSLv3, TLS handshake, Client key exchange (16):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Finished (20):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
{ [data not shown]
* SSLv3, TLS handshake, Finished (20):
{ [data not shown]
* SSL connection using AES128-SHA
* Server certificate:
*        subject: C=US; ST=Washington; L=Seattle; O=Amazon.com Inc.; CN=s3.amazo
naws.com
*        start date: 2014-04-12 00:00:00 GMT
*        expire date: 2015-04-13 23:59:59 GMT
*        subjectAltName: s3.amazonaws.com matched
*        issuer: C=US; O=VeriSign, Inc.; OU=VeriSign Trust Network; OU=Terms of
use at https://www.verisign.com/rpa (c)10; CN=VeriSign Class 3 Secure Server CA
- G3
*        SSL certificate verify result: unable to get local issuer certificate (
20), continuing anyway.
> GET /hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccessKeyId=AKIAJSCBEZJRD
OTGNGZQ HTTP/1.1
> User-Agent: curl/7.21.7 (amd64-pc-win32) libcurl/7.21.7 OpenSSL/0.9.8r zlib/1.
2.5
> Host: s3.amazonaws.com
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< x-amz-request-id: 4566C5AB208C1248
< x-amz-id-2: zF/zr+fbR/pE7nvF7vvUmOdZQeMzjSBI6SPLKH14LGAI5JAb2xyoLhuuDGBDhqcq
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Date: Thu, 25 Sep 2014 14:51:46 GMT
< Server: AmazonS3
<
{ [data not shown]
100   231    0   231    0     0    592      0 --:--:-- --:--:-- --:--:--   704
* Connection #0 to host s3.amazonaws.com left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
} [data not shown]
'Expires' is not recognized as an internal or external command,
operable program or batch file.
'Signature' is not recognized as an internal or external command,
operable program or batch file.

Ошибка 403 указывает на то, что URL-адрес был заделан, но в противном случае он прошел, иначе я получил бы ошибку 400. По какой-то причине в сценарии «&» перенаправляется, потому что они интерпретируются в сценарии.

Если бы вы были мной, как бы вы запускали эту команду, чтобы динамически передавать этот URL, чтобы он не интерпретировался CMD, bash и т.д.? спасибо сэм

1 ответ1

0

Глядя на ваш изначально опубликованный скрипт:

@echo off

for /f "delims=" %%a in ('heroku pgbackups:url') do @set this_url=%%a
ECHO %this_url%
curl -v -o latest.dump -L %this_url%

Если вывод ECHO %this_url% точно такой же, как вы опубликовали, с кавычками, то ваш существующий пакетный скрипт должен работать.

Если значение %this_url% не имеет кавычек, вы должны добавить кавычки в команду curl:

curl -v -o latest.dump -L "%this_url%"

Вы можете изменить команду, чтобы она работала независимо от того, содержит ли %this_url% кавычки, удалив любые существующие кавычки и явно добавив свои собственные:

curl -v -o latest.dump -L "%this_url:"=%"

Другая команда, которую вы перечисляете, выглядит для меня совершенно неправильно:

cmd /k ""curl -v -o latest.dump -l" "('heroku pgbackups:url')""

Внешние кавычки не должны быть необходимы, равно как и кавычки вокруг "curl -v -o latest.dump -l" . Вы можете поместить кавычки вокруг exe-файла только "curl" , но это не нужно, если вы не включите путь к curl, а путь включает пробелы или символы-символы.

Я просто не понимаю синтаксис "('heroku pgbackups:url')" вообще.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .