PowerShell FTP 서버에 연결하여 파일 가져오기
$ftpServer = "ftp.example.com"
$username ="validUser"
$password ="myPassword"
$localToFTPPath = "C:\ToFTP"
$localFromFTPPath = "C:\FromFTP"
$remotePickupDir = "/Inbox"
$remoteDropDir = "/Outbox"
$SSLMode = [AlexPilotti.FTPS.Client.ESSLSupportMode]::ClearText
$ftp = new-object "AlexPilotti.FTPS.Client.FTPSClient"
$cred = New-Object System.Net.NetworkCredential($username,$password)
$ftp.Connect($ftpServer,$cred,$SSLMode) #Connect
$ftp.SetCurrentDirectory($remotePickupDir)
$ftp.GetFiles($localFromFTPPath, $false) #Get Files
FTP 서버에서 파일을 가져올 때 받은 스크립트입니다.
그러나 나는 무엇이 무엇인지 잘 모르겠습니다.remotePickupDir
그리고 이 대본이 맞습니까?
질문에 사용된 알렉스 FTPS 라이브러리가 죽은 것 같습니다(2011년 이후 업데이트되지 않았습니다).
외부 라이브러리 없음
외부 라이브러리 없이도 이를 구현할 수 있습니다.하지만 불행하게도 둘 다.NET Framework나 PowerShell은 디렉터리에 있는 모든 파일을 다운로드할 수 있도록 명시적으로 지원합니다(재귀적 파일 다운로드는 고사하고).
이를 직접 구현해야 합니다.
- 원격 디렉터리 나열
- 항목을 반복하여 파일을 다운로드합니다(선택적으로 하위 디렉토리로 재귀됨 - 다시 나열하는 등).
까다로운 부분은 하위 디렉터리에서 파일을 식별하는 것입니다.휴대용으로 사용할 수 있는 방법은 없습니다.NET ()FtpWebRequest
아니면WebClient
. .도 도 NET 를 .MLSD
명령어는 FTP 프로토콜에서 파일 속성을 가진 디렉토리 목록을 검색할 수 있는 유일한 휴대용 방법입니다.FTP 서버의 개체가 파일인지 디렉토리인지 확인을 참조하십시오.
옵션은 다음과 같습니다.
- 되어 있지 않은
ListDirectory
NLST
FTP command)를 통해 모든 "이름"을 파일로 다운로드하기만 하면 됩니다. - 파일에 대해 실패할 수 있고 디렉터리에 대해 성공할 수 있는 파일 이름에 대해 작업을 수행합니다(또는 그 반대도 마찬가지입니다.즉, "이름"을 다운로드해 볼 수 있습니다.
- 운이 좋을 수도 있고, 특정한 경우에는 파일 이름으로 디렉토리에서 파일을 구분할 수 있습니다(즉, 모든 파일에 확장자가 있는 반면 하위 디렉토리에는 없습니다).
- 합니다()을 사용합니다.
LIST
= =ListDirectoryDetails
및합니다.d)합니다.많은 스타일의 는 *nix하며,합니다.d
입회 초에 는 다른 합니다.그러나 많은 서버는 다른 형식을 사용합니다.다음 예제에서는 이 접근 방식을 사용합니다(*nix 형식 가정).
function DownloadFtpDirectory($url, $credentials, $localPath)
{
$listRequest = [Net.WebRequest]::Create($url)
$listRequest.Method =
[System.Net.WebRequestMethods+Ftp]::ListDirectoryDetails
$listRequest.Credentials = $credentials
$lines = New-Object System.Collections.ArrayList
$listResponse = $listRequest.GetResponse()
$listStream = $listResponse.GetResponseStream()
$listReader = New-Object System.IO.StreamReader($listStream)
while (!$listReader.EndOfStream)
{
$line = $listReader.ReadLine()
$lines.Add($line) | Out-Null
}
$listReader.Dispose()
$listStream.Dispose()
$listResponse.Dispose()
foreach ($line in $lines)
{
$tokens = $line.Split(" ", 9, [StringSplitOptions]::RemoveEmptyEntries)
$name = $tokens[8]
$permissions = $tokens[0]
$localFilePath = Join-Path $localPath $name
$fileUrl = ($url + $name)
if ($permissions[0] -eq 'd')
{
if (($name -ne ".") -and ($name -ne ".."))
{
if (!(Test-Path $localFilePath -PathType container))
{
Write-Host "Creating directory $localFilePath"
New-Item $localFilePath -Type directory | Out-Null
}
DownloadFtpDirectory ($fileUrl + "/") $credentials $localFilePath
}
}
else
{
Write-Host "Downloading $fileUrl to $localFilePath"
$downloadRequest = [Net.WebRequest]::Create($fileUrl)
$downloadRequest.Method =
[System.Net.WebRequestMethods+Ftp]::DownloadFile
$downloadRequest.Credentials = $credentials
$downloadResponse = $downloadRequest.GetResponse()
$sourceStream = $downloadResponse.GetResponseStream()
$targetStream = [System.IO.File]::Create($localFilePath)
$buffer = New-Object byte[] 10240
while (($read = $sourceStream.Read($buffer, 0, $buffer.Length)) -gt 0)
{
$targetStream.Write($buffer, 0, $read);
}
$targetStream.Dispose()
$sourceStream.Dispose()
$downloadResponse.Dispose()
}
}
}
다음과 같은 기능을 사용합니다.
$credentials = New-Object System.Net.NetworkCredential("user", "mypassword")
$url = "ftp://ftp.example.com/directory/to/download/"
DownloadFtpDirectory $url $credentials "C:\target\directory"
코드는 내 C# 예제 C# FTP를 통해 모든 파일과 서브디렉토리를 다운로드합니다.
타사 라이브러리 사용
분석 문제를 하려면 하십시오를 MLSD
명령 및/또는 다양한 구문 분석LIST
목록 형식.그리고 이상적으로 디렉토리에서 모든 파일을 다운로드하거나 심지어 재귀적인 다운로드도 지원합니다.
WinSCP와 같은 경우.NET 어셈블리는 한 번의 호출로 전체 디렉토리를 다운로드할 수 있습니다.
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Ftp
HostName = "ftp.example.com"
UserName = "user"
Password = "mypassword"
}
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionOptions)
# Download files
$session.GetFiles("/directory/to/download/*", "C:\target\directory\*").Check()
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
내부적으로 WinSCP는MLSD
명령(서버에서 지원하는 경우).그렇지 않으면 다음을 사용합니다.LIST
명령어와 수십 가지 다른 목록 형식을 지원합니다.
메서드는 기본적으로 재귀적입니다.
(저는 WinSCP의 저자입니다.
FTP 사이트에서 로컬 디렉토리로 모든 파일(와일드카드 또는 파일 확장명 포함)을 다운로드하는 전체 작동 코드는 다음과 같습니다.변수 값을 설정합니다.
#FTP Server Information - SET VARIABLES
$ftp = "ftp://XXX.com/"
$user = 'UserName'
$pass = 'Password'
$folder = 'FTP_Folder'
$target = "C:\Folder\Folder1\"
#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()
while(-not $reader.EndOfStream) {
$reader.ReadLine()
}
#$reader.ReadToEnd()
$reader.Close()
$response.Close()
}
#SET FOLDER PATH
$folderPath= $ftp + "/" + $folder + "/"
$files = Get-FTPDir -url $folderPath -credentials $credentials
$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
}
원격 선택 디렉터리 경로는 액세스하려는 ftp 서버의 정확한 경로여야 합니다.여기 서버에서 파일을 다운로드 할 스크립트가 있습니다.SSLMode를 사용하여 추가하거나 수정할 수 있습니다.
#ftp server
$ftp = "ftp://example.com/"
$user = "XX"
$pass = "XXX"
$SetType = "bin"
$remotePickupDir = Get-ChildItem 'c:\test' -recurse
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)
foreach($item in $remotePickupDir){
$uri = New-Object System.Uri($ftp+$item.Name)
#$webclient.UploadFile($uri,$item.FullName)
$webclient.DownloadFile($uri,$item.FullName)
}
그remotePickupDir
ftp 서버에서 이동할 폴더입니다."이 대본이 맞습니까?"에 관해서라면, 과연 효과가 있습니까?효과가 있으면 맞는 거죠.만약 효과가 없다면, 어떤 오류 메시지나 예상치 못한 행동이 나타나는지 알려주시면 저희가 더 나은 도움을 드릴 수 있을 것입니다.
Invoke-WebRequest는 HTTP, HTTPS 및 FTP 링크를 다운로드할 수 있습니다.
$source = 'ftp://Blah.com/somefile.txt'
$target = 'C:\Users\someuser\Desktop\BlahFiles\somefile.txt'
$password = Microsoft.PowerShell.Security\ConvertTo-SecureString -String 'mypassword' -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList myuserid, $password
# Download
Invoke-WebRequest -Uri $source -OutFile $target -Credential $credential -UseBasicParsing
cmdlet은 IE 구문 분석을 사용하므로 -UseBasicParsing 스위치가 필요할 수 있습니다.테스트를 통해 확인합니다.
FtpWebRequest가 루트 디렉터리에서 파일을 다운로드하는 이유를 기준으로 합니다. 553 오류가 발생할 수 있습니까? 저는 TLS를 통해 명시적 FTP를 통해 FTP-서버에서 파일을 다운로드할 수 있는 PowerShell 스크립트를 작성했습니다.
# Config
$Username = "USERNAME"
$Password = "PASSWORD"
$LocalFile = "C:\PATH_TO_DIR\FILNAME.EXT"
#e.g. "C:\temp\somefile.txt"
$RemoteFile = "ftp://PATH_TO_REMOTE_FILE"
#e.g. "ftp://ftp.server.com/home/some/path/somefile.txt"
try{
# Create a FTPWebRequest
$FTPRequest = [System.Net.FtpWebRequest]::Create($RemoteFile)
$FTPRequest.Credentials = New-Object System.Net.NetworkCredential($Username,$Password)
$FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$FTPRequest.UseBinary = $true
$FTPRequest.KeepAlive = $false
$FTPRequest.EnableSsl = $true
# Send the ftp request
$FTPResponse = $FTPRequest.GetResponse()
# Get a download stream from the server response
$ResponseStream = $FTPResponse.GetResponseStream()
# Create the target file on the local system and the download buffer
$LocalFileFile = New-Object IO.FileStream ($LocalFile,[IO.FileMode]::Create)
[byte[]]$ReadBuffer = New-Object byte[] 1024
# Loop through the download
do {
$ReadLength = $ResponseStream.Read($ReadBuffer,0,1024)
$LocalFileFile.Write($ReadBuffer,0,$ReadLength)
}
while ($ReadLength -ne 0)
# Close file
$LocalFileFile.Close()
}catch [Exception]
{
$Request = $_.Exception
Write-host "Exception caught: $Request"
}
file/folder를 FTP에서 powerShell을 통해 검색할 때 몇 가지 기능을 작성했는데 FTP에서 숨겨진 내용까지 가져올 수 있습니다.
특정 폴더에 숨겨져 있지 않은 모든 파일을 가져오는 예:
Get-FtpChildItem -ftpFolderPath "ftp://myHost.com/root/leaf/" -userName "User" -password "pw" -hidden $false -File
특정 폴더에 모든 폴더(또한 숨김)를 가져오는 예:
Get-FtpChildItem -ftpFolderPath"ftp://myHost.com/root/leaf/" -userName "User" -password "pw" -Directory
https://github.com/AstralisSomnium/PowerShell-No-Library-Just-Functions/blob/master/FTPModule.ps1 을 설치하지 않고도 다음 모듈에서 기능을 복사할 수 있습니다.
언급URL : https://stackoverflow.com/questions/19059394/powershell-connect-to-ftp-server-and-get-files
'source' 카테고리의 다른 글
SQL Server 2008 GUI에 고유한 제약 조건을 추가하시겠습니까? (0) | 2023.10.09 |
---|---|
정규 표현식에서 (?s)의 의미 (0) | 2023.10.09 |
jQuery로 키 누르기 시뮬레이션 (0) | 2023.10.09 |
서버에서 도메인 간 요청을 활성화하는 방법은? (0) | 2023.10.09 |
범주형 변수의 차트에서 카운트 대신 백분율 표시 (0) | 2023.10.09 |