- Download com SMB
- Download no PowerShell 2
- Download com Invoke-WebRequest
- Autenticando em um web server
Download com SMB
Se você estiver trabalhando em um ambiente de TI híbrido, muitas vezes precisará fazer o download ou o upload de arquivos de ou para a nuvem em seus scripts do PowerShell. Se você usar somente servidores Windows que se comunicam por meio do protocolo SMB (Server Message Block), basta usar o cmdlet Copy-Item para copiar o arquivo de um compartilhamento de rede:
Download no PowerShell 2
O próximo caso simples é onde você tem que baixar um arquivo da web ou de um servidor FTP. No PowerShell 2, você tinha que usar o cmdlet New-Object para essa finalidade:
1
2
|
$WebClient = New-Object System.Net.WebClient
$WebClient.DownloadFile(“https://www.contoso.com/file”,“C:\path\file”)
|
A partir do PowerShell 3, temos o cmdlet Invoke-WebRequest, que é mais conveniente para trabalhar. É a contrapartida do PowerShell para o GNU wget, uma ferramenta popular no mundo do Linux, que é provavelmente a razão pela qual a Microsoft decidiu usar seu nome como um alias para o Invoke-WebRequest. Isto é talvez um eufemismo; O Invoke-WebRequest é mais poderoso que o wget, pois permite não apenas fazer o download de arquivos, mas também analisá-los. Mas este é um tópico para outro post.
Download com Invoke-WebRequest
Para simplesmente baixar um arquivo via HTTP, você pode usar este comando:
1
|
Invoke-WebRequest -Uri “http://www.contoso.com” -OutFile “C:\path\file”
|
No exemplo, apenas baixamos a página HTML que o servidor da web em www.contoso.com gera. Observe que, se você especificar apenas a pasta sem o nome do arquivo, como você pode fazer com o Copy-Item, o PowerShell apresentará o erro:
Invoke-WebRequest: não foi possível encontrar uma parte do caminho
A versão mais curta para a linha de comando é:
1
|
wget “http://www.contoso.com” -outfile “file”
|
Se você omitir o caminho local para a pasta, o Invoke-WebRequest apenas usará sua pasta atual. O parâmetro -Outfile é sempre necessário se você deseja salvar o arquivo. A razão é que, por padrão, o Invoke-WebRequest envia o arquivo baixado para o pipeline.
No entanto, o pipeline não conterá apenas o conteúdo do arquivo. Em vez disso, você encontrará um objeto com uma variedade de propriedades e métodos que permitem analisar arquivos de texto. Se você enviar um arquivo binário pelo pipeline, o PowerShell o tratará como um arquivo de texto e você não poderá usar os dados no arquivo.
Para ler apenas o conteúdo do arquivo de texto, precisamos ler a propriedade Content do objeto no pipeline:
1
|
Invoke-WebRequest “http://www.contoso.com” | Select-Object -ExpandProperty Content | Out-File “file”
|
Este comando faz o mesmo que o anterior. O parâmetro -ExpandProperty garante que o cabeçalho (neste caso, “Conteúdo”) não seja armazenado no arquivo.
Se você deseja ter o arquivo no pipeline e armazená-lo localmente, é necessário usar o parâmetro -PassThru:
1
|
Invoke-WebRequest “http://www.contoso.com” -OutFile “file” -PassThru | Select-Object -ExpandProperty Content
|
Este comando armazena a página da web em um arquivo e exibe o código HTML.
Download e visualização do arquivo
Authenticatindo em um web server
Se o servidor da Web exigir autenticação, você terá que usar o parâmetro -Credential:
1
|
Invoke-WebRequest -Uri https://www.contoso.com/ -OutFile C:“\path\file” -Credential “yourUserName”
|
Observe que, se você omitir o parâmetro -Credential, o PowerShell não solicitará um nome de usuário e senha e lançará esse erro:
Invoke-WebRequest: autorização necessária
Você precisa pelo menos passar o nome do usuário com o parâmetro -Credential. O PowerShell solicitará a senha. Se você quiser evitar uma janela de diálogo em seu script, poderá armazenar as credenciais em um objeto PSCredential:
1
2
|
$Credentials = Get-Credential
Invoke-WebRequest -Uri “https://www.contoso.com“ -OutFile “C:\path\file” -Credential $Credentials
|
Você pode usar o parâmetro -UseDefaultCredentials em vez do parâmetro -Credential se quiser usar as credenciais do usuário atual. Para adicionar um pouco de segurança extra, você pode querer criptografar a senha. Certifique-se de sempre usar HTTPS em vez de HTTP se você tiver que autenticar em um servidor remoto. Se o servidor da Web usar autenticação básica, sua senha será transmitida em texto não criptografado se você fizer o download via HTTP.
Observe que esse método funciona apenas se o servidor da Web gerenciar a autenticação. Atualmente, a maioria dos sites usa os recursos de um sistema de gerenciamento de conteúdo (CMS) para autenticar usuários. Normalmente, você precisa preencher um formulário HTML. Vou explicar em um dos meus próximos posts como você pode fazer isso com o Invoke-WebRequest.
Baixando arquivos através de FTP funciona de forma análoga ao HTTP. Você também não deve usar este protocolo se a segurança for importante. Para baixar vários arquivos com segurança, é melhor trabalhar com SFTP ou SCP. O Invoke-WebRequest não suporta esses protocolos. No entanto, existem módulos do PowerShell de terceiros que entram na violação.
wonderful post, very informative. I wonder why the other specialists of this sector do not notice this. You must continue your writing. I am confident, you’ve a great readers’ base already!