【发布时间】:2015-07-09 01:02:56
【问题描述】:
我正在编写一个 PowerShell 脚本,以帮助为我的工作设置新 PC。希望这不仅仅是我一个人使用的,所以我正在尝试考虑一切。
我在我们的 FTP 服务器上保存了离线安装程序(java、flash、阅读器等),如果本地副本尚未保存在创建的 Apps 目录中,脚本会下载这些安装程序。随着新版本程序的发布,FTP 服务器上的文件会定期更新。我希望脚本可以选择检查安装程序的较新版本,以防有人喜欢随身携带本地副本而忘记不时检查服务器。它还需要在 Windows 7 中工作,而无需导入其他模块,除非有一种简单的方法可以同时在多台 PC 上执行此操作。我知道 import 命令,但是我的经验需要我将模块文件复制到 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)
}
更新:
这是在 Martin 的帮助下我得到的。它有点工作。它从 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
}
}
【问题讨论】:
-
您的最终代码应该可以正常工作,除了您应该将整个
if ($tokens -gt $localtime)块移动到if ($code -eq 213)块中。否则,如果时间戳检索失败,则您正在比较未定义的变量。
标签: windows powershell ftp