簡體   English   中英

如果遠程副本在PowerShell中較新,如何將本地文件的使用期限與FTP服務器上的文件進行比較並下載

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM