#powershell
#powershell
Вопрос:
Привет всем, я новичок в написании сценариев power shell, я пытаюсь загрузить все файлы в корневом каталоге и файлы в подпапке на основе имени файла с FTP-сервера. Поскольку я ищу файлы, которые были сопоставлены по именам файлов в like, поскольку мой путь всегда будет указывать на корневой каталог, а корневой каталог содержит текстовые файлы и вложенные папки, вложенные папки содержат текстовые файлы.
Я нашел пример получения текстовых файлов для загрузки на локальный с ftp-сервера, но в примере, который я нашел, загружаются только текстовые файлы из корневого каталога, он не сканирует вложенные папки и не получает файлы во вложенных папках.
Вот пример, который я попробовал
# $url = "ftp://XXX.com/"
$user = 'UserName'
$pass = 'Password'
$folder = 'FTP_Folder'
$target = "C:FolderFolder1"
#SET CREDENTIALS
$credentials = new-object System.Net.NetworkCredential($user, $pass)
function Get-FtpDir ($url,$credentials) {
$request = [Net.WebRequest]::Create($url)
$request.Method = [System.Net.WebRequestMethods FTP]::ListDirectory
if ($credentials) { $request.Credentials = $credentials }
$response = $request.GetResponse()
$reader = New-Object IO.StreamReader $response.GetResponseStream()
$reader.ReadToEnd()
$reader.Close()
$response.Close()
}
#SET FOLDER PATH
$folderPath= $ftp "/" $folder "/"
$Allfiles=Get-FTPDir -url $folderPath -credentials $credentials
$files = ($Allfiles -split "`r`n")
$files
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)
$counter = 0
foreach ($file in ($files | where {$_ -like "*.txt"})){
$source=$folderPath $file
$destination = $target $file
$webclient.DownloadFile($source, $target $file)
#PRINT FILE NAME AND COUNTER
$counter
$counter
$source
}
Я попробовал использовать функции модуля PSFTP, такие как функция Get-ftpchilditem с рекурсивным, но у меня это не сработало.
Пожалуйста, помогите мне в этом, чтобы получить файлы из корневой папки и вложенных папок FTP-сервера в локальную систему.
Ответ №1:
Я делал это в прошлом, используя WinSCP и SFTP. Пример приведен ниже. При этом используется SFTP SCP, который в основном работает по SSH. Я уверен, что вы можете изменить протокол WinSCP на ftp и попробовать другую комбинацию. Надеюсь, это вам поможет. Измените маски файлов, чтобы они включали только .txt, и это будет проходить через вложенные папки. Также для этой работы вам потребуется WinSCPnet.dll и WinSCP.exe который вы можете легко загрузить с сайта WinSCP. Загрузите «.Net Assembly / COM Library» и сохраните скрипт и необходимые файлы в той же папке и обновите путь в скрипте. Удачи.
# Load WinSCP .NET assembly
Add-Type -Path "C:Usersadministrator.ADDocumentsWinSCP ScriptWinSCPnet.dll"
$hostname = "ftp.xyz.net"
$user = "me"
$pass = "mypassword"
$sfolder = "/home/me"
$dfolder = "C:tmp"
$sshHostKeyFingerprint = "ssh-rsa 2048 eb:2c:f9:ab:19:2e:0c:22:02:d4:8f:64:44:75:ec:04"
$mask = "*.jpg;*.jpeg;*.png;*.tiff;*.txt"
####################### END USER CONFIGURABLE SETTINGS #########################
# Main script
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Scp
HostName = $hostname
UserName = $user
Password = $pass
SshHostKeyFingerprint = $sshHostKeyFingerprint
}
$session = New-Object WinSCP.Session
$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.FileMask = "*.jpg; *.jpeg; *.png; *.tiff;"
try
{
# Will continuously report progress of synchronization
$session.add_FileTransferred( { FileTransferred($_) } )
# Connect
$session.Open($sessionOptions)
# Synchronize files
$synchronizationResult = $session.SynchronizeDirectories(
[WinSCP.SynchronizationMode]::Local,$dfolder, $sfolder, $False, $False, 1, $transferOptions)
# Throw on any error
$synchronizationResult.Check()
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
Комментарии:
1. Спасибо Junaid за быстрое воспроизведение … Это очень полезно.
2. Привет, Junid, пожалуйста, посмотрите на приведенный ниже сценарий, о котором я упоминал, и помогите мне… Заранее спасибо