Como posso aplicar aspas a um URL em um script .bat?

0

A forma geral de um comando curl no CMD que funciona é:

curl -o latest.dump -L " link "

Mas a URL é gerada dinamicamente para que eu coloque isso em um script .bat. OK, não há problema, então aqui está meu script .bat que no papel deve funcionar.

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

Mas a saída se aplica porque no primeiro '&' Como você pode esperar. O eco de this_url mostra a string completa com aspas. Como posso acrescentar ou forçar a encapsular essa string com aspas?

Eu tentei, mas ele retorna o mesmo tipo de erro:

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

Alguns podem perguntar por que não fazer isso no Unix ou no CYGWIN? Eu fiz isso primeiro. O comando funciona perfeitamente na minha máquina pessoal do OS X. Então, deveria funcionar no CYGWIN? Bem, eu recebo o mesmo tipo de erros.

Eu tentei incorporar um script Perl usando a biblioteca uri_escape e inseri-lo. Mas o URL que ele passa não é reconhecido por curl.

Forçar a saída entre aspas simples munges a URL em que ele começa correto, mas a aspa simples de fechamento é colocada dentro dos últimos caracteres da URL que torna inútil para enrolar.

A saída de heroku pgbackups:url no console do CMD é:

"https://s3.amazonaws.com/hkpgbackups/[email protected]/b080.dump?AWSAccess
KeyId=AKIAJSCBEZJRDOTGNGZQ&Expires=1411657655&Signature=MqzqBitAN7MADiLAsdAN4ZQk
RH0%3D"

A saída do arquivo .bat acima é:

https://s3.amazonaws.com/hkpgbackups/[email protected]/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/[email protected]/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.

O erro 403 indica que o URL foi removido, mas, caso contrário, ele passou ou eu teria recebido um erro 400. Por algum motivo no script, o "&" são redirecionados porque são interpretados no script.

Se você fosse eu, como você executaria esse comando dinamicamente passasse essa URL para que ela não fosse interpretada por CMD, bash, etc? thanx, sam

    
por sam452 23.09.2014 / 19:48

1 resposta

0

Olhando para o seu script publicado originalmente:

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

Se a saída de ECHO %this_url% for exatamente como você publicou, com aspas ao seu redor, o script em lote existente deverá funcionar.

Se o valor de %this_url% não tiver aspas, adicione as cotações ao comando curl:

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

Você pode modificar o comando para que ele funcione, independentemente de %this_url% conter citações removendo as cotações existentes e explicitamente adicionando as suas próprias:

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

O outro comando listado parece completamente errado para mim:

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

As aspas externas não devem ser necessárias, nem as aspas em torno de "curl -v -o latest.dump -l" . Você pode colocar aspas ao redor do arquivo exe apenas "curl" , mas isso não deve ser necessário, a menos que você inclua o caminho para curl e o caminho inclua espaços ou caracteres suspeitos.

Eu simplesmente não entendo a sintaxe "('heroku pgbackups:url')" .

    
por 25.09.2014 / 03:05