![](/img/trans.png)
[英]Download a file from Remote Server(https) using powershell with credentials
[英]How to compare age of local file with file on FTP server and download if remote copy is newer in PowerShell
我正在編寫一個PowerShell腳本,以幫助為我的工作設置新PC。 希望不僅僅是我會使用它,所以我正在嘗試考慮所有問題。
如果尚未將本地副本保存在創建的Apps目錄中,則我的FTP服務器上保存了脫機安裝程序(java,flash,閱讀器等),腳本將下載該腳本下載。 隨着程序新版本的發布,FTP服務器上的文件將定期更新。 我希望腳本具有檢查安裝程序較新版本的選項,以防有人喜歡隨身攜帶本地副本而忘記時不時檢查服務器。 它還需要在Windows 7中工作,而無需導入其他模塊,除非有一次簡便的方法一次可以在多台PC上進行此操作。 我知道導入命令,但是我需要經歷才能將模塊文件復制到PC上的多個位置,然后才能使用。
現在,我還沒有找到任何解決方案的運氣。 我找到了用於檢查本地文件或本地服務器上文件的修改日期的代碼,但是除了上載\\下載文件外,沒有其他處理FTP的代碼。
這是我嘗試過的最后一件事。 我嘗試結合使用FTP查找本地文件。 表現不太好。
我是PowerShell的新手,但到目前為止,我一直很擅長將整個過程結合在一起。 但是,這種想法變得麻煩。
感謝您的幫助。
$ftpsite = "ftp://ftpsite.com/folder/"
$firefox = (Get-Item $dir\Apps\install_firefox.exe).LastWriteTime.toString("MM/dd/yyyy")
if ($firefoxftp = (Get-ChildItem $ftpsite/install_firefox.exe | Where{$_.LastWriteTime -gt $firefox})) {
$File = "$dir\Apps\install_firefox.exe"
$ftp = "ftp://ftpsite.com/folder/install_firefox.exe"
$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)
$webclient.DownloadFile($uri, $File)
}
更新:
這是在馬丁的幫助下我所擁有的。 這樣的作品。 它從FTP下載文件,但沒有正確比較遠程和本地。 遠程文件返回20150709140505,本地文件返回07/09/2015 2:05:05 PM。 如何在比較之前將一個格式設置為與另一個外觀相似,並且“ -gt”是正確使用的比較?
謝謝!
function update {
$ftprequest = [System.Net.FtpWebRequest]::Create("ftp://ftpsite.com/Script_Apps/install_firefox.exe")
$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::GetDateTimestamp
$response = $ftprequest.GetResponse().StatusDescription
$tokens = $response.Split(" ")
$code = $tokens[0]
$localfile = (Get-Item "$dir\Apps\install_firefox.exe").LastWriteTimeUtc
if ($tokens -gt $localfile) {
write-host "Updating Firefox Installer..."
$File = "$dir\Apps\install_firefox.exe"
$ftp = "ftp://ftpsite.com/Script_Apps/install_firefox.exe"
$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)
$webclient.DownloadFile($uri, $File)
"Updated Firefox" >> $global:logfile
mainmenu
}
else {
Write-Host "Local Copy is Newer."
sleep 3
mainmenu
}
}
更新2:
似乎正在工作! 這是代碼。 謝謝您的幫助!
function update {
$ftprequest = [System.Net.FtpWebRequest]::Create("ftp://ftpserver.com/Script_Apps/install_firefox.exe")
$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::GetDateTimestamp
$response = $ftprequest.GetResponse().StatusDescription
$tokens = $response.Split(" ")
$code = $tokens[0]
$localtime = (Get-Item "$dir\Apps\install_firefox.exe").LastWriteTimeUtc
if ($code -eq 213) {
$tokens = $tokens[1]
$localtime = "{0:yyyymmddHHmmss}" -f [datetime]$localtime
}
if ($tokens -gt $localtime) {
write-host "Updating Firefox Installer..."
$File = "$dir\Apps\install_firefox.exe"
$ftp = "ftp://ftpserver.com/Script_Apps/install_firefox.exe"
$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)
$webclient.DownloadFile($uri, $File)
"Updated Firefox" >> $global:logfile
mainmenu
}
else {
Write-Host "Local Copy is Newer."
sleep 3
mainmenu
}
}
您不能使用WebClient
類檢查遠程文件的時間戳。
您可以將FtpWebRequest
類及其GetDateTimestamp
FTP “方法”一起使用,並解析它返回的UTC時間戳字符串。 格式由RFC 3659指定為YYYYMMDDHHMMSS[.sss]
。
僅當FTP服務器支持該方法在MDTM
使用的MDTM
命令(大多數服務器可以,但不是全部)時,該方法MDTM
。
$ftprequest = [System.Net.FtpWebRequest]::Create("ftp://ftpsite.com/folder/install_firefox.exe")
$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::GetDateTimestamp
$response = $ftprequest.GetResponse().StatusDescription
$tokens = $response.Split(" ")
$code = $tokens[0]
if ($code -eq 213)
{
Write-Host "Timestamp is" $tokens[1]
}
else
{
Write-Host "Error" $response
}
它將輸出類似:
Timestamp is 20150709065036
現在,您解析它,並與本地文件的UTC時間戳進行比較:
(Get-Item "install_firefox.exe").LastWriteTimeUtc
或者節省一些時間,並使用可以幫助您完成此任務的FTP庫/工具。
例如,對於WinSCP .NET程序集 ,您可以通過一次調用Session.SynchronizeDirectories
來將帶有本地副本的安裝程序的整個遠程文件夾同步。 或者,您可以將同步限制為僅單個文件。
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::Ftp
$sessionOptions.HostName = "ftpsite.com"
$session = New-Object WinSCP.Session
# Connect
$session.Open($sessionOptions)
$transferOptions = New-Object WinSCP.TransferOptions
# Synchronize only this one file.
# If you remove the file mask, all files in the folder are synchronized:
$transferOptions.FileMask = "install_firefox.exe"
$session.SynchronizeDirectories(
[WinSCP.SynchronizationMode]::Local, "$dir\Apps", "/folder",
$False, $False, [WinSCP.SynchronizationCriteria]::Time,
$transferOptions).Check()
要使用程序集,只需將.NET程序包的內容提取到腳本文件夾中即可。 無需其他安裝。
該程序集不僅支持MDTM
,而且還支持其他替代方法來檢索時間戳。
另請參閱一個相關的Powershell示例 ,該示例同時顯示上述代碼和其他技術。
(我是WinSCP的作者)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.