我是PowerShell的新手,我試圖轉換一個批處理文件,該文件根據名稱和擴展名從ftp站點上的目錄下載多個文件。儘管我發現了幾個下載文件的例子,但我努力找到一個能夠顯示如何下載多個文件的例子。在批處理中,我可以很簡單地使用ftp.exe和帶有通配符的mget命令?FTP使用PowerShell下載多個文件
有人可以請指出我在正確的方向。
在此先感謝。 約翰
我是PowerShell的新手,我試圖轉換一個批處理文件,該文件根據名稱和擴展名從ftp站點上的目錄下載多個文件。儘管我發現了幾個下載文件的例子,但我努力找到一個能夠顯示如何下載多個文件的例子。在批處理中,我可以很簡單地使用ftp.exe和帶有通配符的mget命令?FTP使用PowerShell下載多個文件
有人可以請指出我在正確的方向。
在此先感謝。 約翰
在批處理我可以很簡單地使用Ftp.exe和MGET命令 使用通配符?
如果您願意,您可以在Powershell中執行相同操作。
對於更多的Powershell方式,您可以使用FTPWebRequest。看到這裏:http://msdn.microsoft.com/en-us/library/ms229711.aspx。您可以構建該示例以循環下載多個文件。
但底線是,您不必將批量轉換爲Powershell。如果你願意,你可以,但是你有批量的東西,尤其是在調用外部程序的時候,應該也能工作。
有多種方法可以實現這一點。一種是使用System.Net.FtpWebRequest如圖所示: http://www.systemcentercentral.com/BlogDetails/tabid/143/IndexID/81125/Default.aspx
或者有/ n軟件NetCmdlets你可以使用:
感謝您的快速響應。我看了你的第一個例子,但問題是它假設我知道我將要下載什麼。至於/ n NetCmdlets,唉,我的公司不會支付他們:-( – 2012-01-05 05:25:25
啊,所以使用通配符是唯一的選擇!我會看看如果我有任何其他的參考。 – ravikanth 2012-01-05 09:10:17
你可能想看看另一種資源: PowerShell的FTP客戶端模塊
http://gallery.technet.microsoft.com/scriptcenter/PowerShell-FTP-Client-db6fe0cb
奇怪的是有在cmdlet來處理FTP沒有內置。我不確定爲什麼PowerShell團隊做出了這個決定,但這意味着您必須依靠使用.NET代碼,第三方腳本/模塊/管理單元或Win32程序(如FTP.exe),因爲其他人已經回答。
這裏是下載使用.NET代碼多個文件(二進制和文本)的例子:
$files = "Firefox Setup 9.0.exe", "Firefox Setup 9.0.exe.asc"
$ftpFolder = 'ftp://ftp.mozilla.org/pub/firefox/releases/9.0/win32/en-US'
$outputFolder = (Resolve-Path "~\My Documents").Path
foreach ($file in $files) {
try {
$uri = $ftpFolder + '/' + $file
$request = [Net.WebRequest]::Create($uri)
$request.Method = [Net.WebRequestMethods+Ftp]::DownloadFile
$responseStream = $request.GetResponse().GetResponseStream()
$outFile = Join-Path $outputFolder -ChildPath $file
$fs = New-Object System.IO.FileStream $outFile, "Create"
[byte[]] $buffer = New-Object byte[] 4096
do {
$count = $responseStream.Read($buffer, 0, $buffer.Length)
$fs.Write($buffer, 0, $count)
} while ($count -gt 0)
} catch {
throw "Failed to download file '{0}/{1}'. The error was {2}." -f $ftpFolder, $file, $_
} finally {
if ($fs) { $fs.Flush(); $fs.Close() }
if ($responseStream) { $responseStream.Close() }
}
}
我認爲這會工作,但我會需要在我下載之前創建$ files列表,因爲文件名每天更改。在VBscript中,我會使用類似於 「mget」和「IDY03101。」&Year()和Month()&Day()&「* .axf「,它可以下載當天的所有文件 – 2012-01-05 23:16:41
@JohnE你想使用'Get-Date' cmdlet來格式化文件名'$ file ='IDY03101。{0} .axf'-f(Get- Date -Format yyyyddmm)'。 – 2012-01-06 02:04:22
感謝Andy,我想我現在唯一需要做的就是找到一個導出用於$ files的文件列表的好方法。@ravikanth示例是否是一個很好的方法來執行此操作? – 2012-01-06 04:20:25
@Jacob。您需要:: ListDirectory方法來創建一個列表。之後,您必須使用out-file命令將其輸出到文本文件中。之後,您使用get-content命令導入列表。因此,使用文本文件,您可以使用foreach循環創建一個對象集合(不要忘記跳過帶'-cne'條件的最後一行)。 您可以在此循環中使用您的循環參數包含您的download-ftp函數。 瞭解?不知道我的解釋是否好。
所以這是一個例子,從我的劇本之一:
$files = Get-FtpList $ftpSource $ftpDirectory $ftpLogin $ftpPassword | Out-File -Encoding UTF8 -FilePath list.txt
$list = Get-Content -Encoding UTF8 -Path list.txt
foreach ($entry in $list -cne "")
{
Get-FtpFile $ftpSource $ftpDirectory $entry $target $ftpLogin $ftpPassword
Start-Sleep -Milliseconds 10
}
希望它現在爲你工作。
PS:Get-FtpList和Get-FtpFile是自定義函數。
這就是我所做的。當我需要下載一個基於模式的文件時,我動態地創建了一個命令文件,然後讓其他的使用ftp做 我使用了基本的powershell命令。我不需要下載任何附加組件 我首先檢查是否存在必需的文件數量。如果他們這樣做,我第二次使用Mget調用FTP。 我這運行從Windows 2008服務器連接到Windows XP的遠程服務器
function make_ftp_command_file($p_file_pattern,$mget_flag)
{
# This function dynamically prepares the FTP file
# The file needs to be prepared daily because the pattern changes daily
# Powershell default encoding is Unicode
# Unicode command files are not compatible with FTP so we need to make sure we create an ASCII File
write-output "USER" | out-file -filepath C:\fc.txt -encoding ASCII
write-output "ftpusername" | out-file -filepath C:\fc.txt -encoding ASCII -Append
write-output "password" | out-file -filepath C:\fc.txt -encoding ASCII -Append
write-output "ASCII" | out-file -filepath C:\fc.txt -encoding ASCII -Append
If($mget_flag -eq "Y")
{
write-output "prompt" | out-file -filepath C:\fc.txt -encoding ASCII -Append
write-output "mget $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append
}
else
{
write-output "ls $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append
}
write-output quit | out-file -filepath C:\fc.txt -encoding ASCII -Append
}
########################### Init Section ###############################
$yesterday = (get-date).AddDays(-1)
$yesterday_fmt = date $yesterday -format "yyyyMMdd"
$file_pattern = "BRAE_GE_*" + $yesterday_fmt + "*.csv"
$file_log = $yesterday_fmt + ".log"
echo $file_pattern
echo $file_log
############################## Main Section ############################
# Change location to folder where the files need to be downloaded
cd c:\remotefiles
# Dynamically create the FTP Command to get a list of files from the Remote Servers
echo "Call function that creates a FTP Command "
make_ftp_command_file $file_pattern N
#echo "Connect to remote site via FTP"
# Connect to Remote Server and get file listing
ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log
$matches=select-string -pattern "BRAE_GE_[A-Z][A-Z]*" C:\logs\$file_log
# Check if the required number of Files available for download
if ($matches.count -eq 36)
{
# Create the ftp command file
# this time the command file has an mget rather than an ls
make_ftp_command_file $file_pattern Y
# Change directory if not done so
cd c:\remotefiles
# Invoke Ftp with newly created command file
ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log
}
else
{
echo "Full set of Files not available"
}
這不是PowerShell中的特定。但我已經嘗試了很多其他的解決方案,並且到目前爲止
該http://ncftp.com/客戶端運行最好。它與ncftpls.exe
列出遠程文件和ncftpget.exe
獲取文件。在使用它們時Start-Process -Wait
的文件列表可以在一個變量來構造,並用常規的FTP命令中使用....
$FileList="file1_$cycledate.csv
file2_$cycledate.csv
file3_$cycledate.csv
file4_$cycledate.csv"
"open $FTPServer
user $FTPUser $FTPPassword
ascii
cd report
" +
($filelist.split(' ') | %{ "mget $_" }) | ftp -i -n
我同意你說的話,但在此caase使用Win32 FTP.exe並沒有給我足夠的靈活性;考慮到PowerShell並沒有給我提供功能,這有點奇怪!?! – 2012-01-05 23:34:05