папки, загружаемые как файлы в ftp

Вопрос:

Поэтому в моем скрипте powershell, когда он запускается, он опросает ftp-сервер и загружает любые файлы, которые не находятся в локальной папке. Проблема в том, когда она попадает в папки, которые она загружает в виде файлов. это мой код для проверки новых файлов:

$LocFolder = 'C:\EMSDropBox\*'
Remove-Item $LocFolder
$ftprequest = [System.Net.FtpWebRequest]::Create("ftp://NZHQFTP1/tbarnes")
$ftprequest.Proxy = $null
$ftprequest.KeepAlive = $false
$ftprequest.TimeOut = 10000000
$ftprequest.UsePassive = $False
$ftprequest.Credentials = New-Object System.Net.NetworkCredential("tbarnes", "Static_flow2290")
$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory

$FTPResponse = $ftprequest.GetResponse()
$ResponseStream = $FTPResponse.GetResponseStream()
$FTPReader = New-Object System.IO.Streamreader($ResponseStream)
$filename = $FTPReader.ReadLine()
while($filename -ne $null)
{
try
{
if((Test-Path ("C:\emsdropbox\"+$filename)) -ne $true)
{
downloadFtp($filename)
}
$filename = $FTPReader.ReadLine()
}
catch
{
Write-Host $_
}
}
$FTPReader.Close()
$FTPResponse.Close()
$ResponseStream.Close()

и это функция downloadFtp:

     # FTP Config
$FTPHost = "****"
$Username = "******"
$Password = "*********"
$FTPFile = $file

# FTP Log File Url
$FTPFileUrl = "ftp://" + $FTPHost + "/tbarnes/" + $FTPFile

# Create FTP Connection
$FTPRequest = [System.Net.FtpWebRequest]::Create("$FTPFileUrl")
$FTPRequest.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
$FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$FTPRequest.UsePassive = $false
$FTPRequest.UseBinary = $true
$FTPRequest.KeepAlive = $false
$targetfile = New-Object IO.FileStream (("C:\emsdropbox\"+$file),[IO.FileMode]::Create)
# Get FTP File
$FTPResponse = $FTPRequest.GetResponse()
$ResponseStream = $FTPResponse.GetResponseStream()
$FTPReader = New-Object -typename System.IO.StreamReader -ArgumentList $ResponseStream
[byte[]]$readbuffer = New-Object byte[] 1024

#loop through the download stream and send the data to the target file
do{
$readlength = $ResponseStream.Read($readbuffer,0,1024)
$targetfile.Write($readbuffer,0,$readlength)
}
while ($readlength -ne 0)
$FTPReader.Close()

Я не уверен, почему это не приведет их вниз, как папки, чтобы любая помощь или указатели были бы замечательными!

Лучший ответ:

Методы FTP не поддерживают загрузку папок или рекурсию сами по себе, поэтому нет другого способа, я могу думать об этом, но о том, что я предложил ниже.

Измените метод, чтобы вы могли различать файлы и каталоги и обрабатывать их соответственно.

Измените $ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory на $ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectoryDetails

Что будет отображаться в этом формате:

-rwxrwxrwx   1 owner    group          277632 Mar  4 17:15 xml_socket.log.rar

Каталоги будут иметь d вместо » - в начале строки.

Вот исправленный блок try который будет соответствовать только файлам, чтобы вы могли перейти к функции downloadFtp:

    try
{
    if(!($filename -match '^d')){if((Test-Path ("C:\emsdropbox\"+$filename.Split(" ")[8])) -ne $true)
    {
        downloadFtp(($filename -split '\s+')[8])
    }}
    $filename = $FTPReader.ReadLine()
}

Если вы хотите получить список каталогов, используйте следующий блок try против того же потока ftpresponse и для каждого, ListDirectoryDetails чтобы получить список файлов в каждом каталоге для их обработки:

    try
{
    if($filename -match '^d'){if((Test-Path ("C:\emsdropbox\"+$filename.Split(" ")[8])) -ne $true)
    {
        listdir(($filename -split '\s+')[8])
    }}
    $filename = $FTPReader.ReadLine()
}

Вам также может понадобиться создать локальные каталоги, которые вы можете сделать в PowerShell следующим образом:

New-Item c:\emsdropbox\newdir -type directory

Оцените статью
TechArks.Ru
Добавить комментарий