下載SMB
如果您在混合IT環境中工作,則通常需要在PowerShell腳本中從雲下載或上載文件。
如果僅使用通過服務器消息塊(SMB)協議進行通信的Windows服務器,則只需使用Copy-Item cmdlet從網絡共享中復制文件:
Copy-Item \\server\share\file -Destination c:\path\
在PowerShell中下載2
下一個簡單的情況是您必須從Web或FTP服務器下載文件
在PowerShell 2中,您必須為此目的使用New-Object cmdlet:
$webClient=New-Object System.Net.WebClient $webClient.DownloadFile($url,"c:\2.png")
從PowerShell 3開始,我們有了Invoke-WebRequest cmdlet,它更方便使用
它是PowerShell與GNU wget的對應物,GNU wget是Linux世界中的一個流行工具,這可能是微軟決定將其名稱用作Invoke-WebRequest的別名的原因
這或許是輕描淡寫; Invoke-WebRequest比wget更強大,因為它不僅可以下載文件,還可以解析它們
使用Invoke-WebRequest下載
要通過http簡單的下載文件,可以使用以下命令:
Invoke-WebRequest -Uri "http://www.example.com" -OutFile "C:\path\file"
如果省略文件夾的本地路徑,Invoke-WebRequest將只使用您當前的文件夾
如果要保存文件,則始終需要-Outfile參數。 原因是,默認情況下,Invoke-WebRequest將下載的文件發送到管道。
但是,管道將不僅包含文件的內容。 相反,您將找到一個具有各種屬性和方法的對象,允許您分析文本文件。
如果通過管道發送二進制文件,PowerShell會將其視為文本文件,您將無法使用該文件中的數據。
要只讀取文本文件的內容,我們需要讀取管道中對象的Content屬性:
Invoke-WebRequest "http://www.example.com" | Select-Object -ExpandProperty Content | Out-File "file"
如果要將文件放在管道中並將其存儲在本地,則必須使用-PassThru參數:
Invoke-WebRequest "http://www.contoso.com" -OutFile "file" -PassThru | Select-Object -ExpandProperty Content
在Web服務器上進行身份驗證
如果Web服務器需要身份驗證,則必須使用-Credential參數:
Invoke-WebRequest -Uri https://www.example.com/ -OutFile C:"\path\file" -Credential "yourUserName"
請注意,如果省略-Credential參數,PowerShell將不會提示您輸入用戶名和密碼,並將拋出此錯誤:
Invoke-WebRequest:需要授權
您必須至少使用-Credential參數傳遞用戶名。 然后PowerShell會要求輸入密碼。
如果要避免腳本中的對話窗口,可以將憑據存儲在PSCredential對象中:
$Credentials = Get-Credential Invoke-WebRequest -Uri "https://www.example.com" -OutFile "C:\path\file" -Credential $Credentials
如果要使用當前用戶的憑據,可以使用-UseDefaultCredentials參數而不是-Credential參數
要添加一些額外的安全性,您可能需要加密密碼。如果必須在遠程服務器上進行身份驗證,請確保始終使用HTTPS而不是HTTP。
如果Web服務器使用基本身份驗證,則如果通過HTTP下載,則密碼將以明文形式傳輸。
請注意,此方法僅在Web服務器管理身份驗證時有效。如今,大多數網站都使用內容管理系統(CMS)的功能來對用戶進行身份驗證。通常,您必須填寫HTML表單。