PowerShell을 사용하여 FTP로 파일 업로드




(8)

PowerShell을 사용하여 FTP가있는 파일을 익명 FTP 서버로 전송하려고합니다. 나는 여분의 패키지를 사용하지 않을 것이다. 방법?

스크립트가 멈추거나 충돌 할 위험이 없어야합니다.


Answers

나는 당신이 제어 할 수없는 것들 (서버가 중반 업로드 파워를 잃는다면 어떨까요?)이 있기 때문에 스크립트가 매달리지 않거나 부서지지 않도록 100 % 총알 증명을 할 수 있을지 확신하지 못합니다. 그러나 이것은 당신이 시작하기위한 견고한 기반을 제공 할 것입니다 :

# create the FtpWebRequest and configure it
$ftp = [System.Net.FtpWebRequest]::Create("ftp://localhost/me.png")
$ftp = [System.Net.FtpWebRequest]$ftp
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftp.Credentials = new-object System.Net.NetworkCredential("anonymous","[email protected]")
$ftp.UseBinary = $true
$ftp.UsePassive = $true
# read in the file to upload as a byte array
$content = [System.IO.File]::ReadAllBytes("C:\me.png")
$ftp.ContentLength = $content.Length
# get the request stream, and write the bytes into it
$rs = $ftp.GetRequestStream()
$rs.Write($content, 0, $content.Length)
# be sure to clean up after ourselves
$rs.Close()
$rs.Dispose()

PowerShell을 사용하여 FTP 서버에 바이너리 파일을 업로드하는 가장 간단한 방법은 WebClient.UploadFile 사용하는 것입니다.

$client = New-Object System.Net.WebClient
$client.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$client.UploadFile("ftp://ftp.example.com/remote/path/file.zip", "C:\local\path\file.zip")

더 큰 통제가 필요하다면 WebClient 는 TLS / SSL 암호화 등과 같이 제공하지 않으며 FtpWebRequest 사용하십시오. 쉬운 방법은 Stream.CopyTo 사용하여 FileStream 을 FTP 스트림으로 복사하는 Stream.CopyTo .

$request = [Net.WebRequest]::Create("ftp://ftp.example.com/remote/path/file.zip")
$request.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile 

$fileStream = [System.IO.File]::OpenRead("C:\local\path\file.zip")
$ftpStream = $request.GetRequestStream()

$fileStream.CopyTo($ftpStream)

$ftpStream.Dispose()
$fileStream.Dispose()

업로드 진행률을 모니터링해야하는 경우 콘텐츠를 청크별로 복사해야합니다.

$request = [Net.WebRequest]::Create("ftp://ftp.example.com/remote/path/file.zip")
$request.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile 

$fileStream = [System.IO.File]::OpenRead("C:\local\path\file.zip")
$ftpStream = $request.GetRequestStream()

$buffer = New-Object Byte[] 10240
while (($read = $fileStream.Read($buffer, 0, $buffer.Length)) -gt 0)
{
    $ftpStream.Write($buffer, 0, $read)
    $pct = ($fileStream.Position / $fileStream.Length)
    Write-Progress `
        -Activity "Uploading" -Status ("{0:P0} complete:" -f $pct) `
        -PercentComplete ($pct * 100)
}

$fileStream.CopyTo($ftpStream)

$ftpStream.Dispose()
$fileStream.Dispose()

여기 내 멋진 버전이 있기 때문에 그것이 진행 막대 :-)

어느 것이 완전히 쓸모없는 기능인지는 알지만, 여전히 멋있다. \ m / \ m /

$webclient = New-Object System.Net.WebClient
Register-ObjectEvent -InputObject $webclient -EventName "UploadProgressChanged" -Action { Write-Progress -Activity "Upload progress..." -Status "Uploading" -PercentComplete $EventArgs.ProgressPercentage } > $null

$File = "filename.zip"
$ftp = "ftp://user:[email protected]/filename.zip"
$uri = New-Object System.Uri($ftp)
try{
    $webclient.UploadFileAsync($uri, $File)
}
catch  [Net.WebException]
{
    Write-Host $_.Exception.ToString() -foregroundcolor red
}
while ($webclient.IsBusy) { continue }

추신. "도움이되지 않습니까? 아니면 느린 ASDL 연결일까요?"


나는 이것이 최고로 뽑힌 해결책보다 더 우아하다고 주장하지 않을 것이다. 그러나 이것은 그 자신의 방식으로 멋지다 (적어도 내 마음 LOL에서는).

$server = "ftp.lolcats.com"
$filelist = "file1.txt file2.txt"   

"open $server
user $user $password
binary  
cd $dir     
" +
($filelist.split(' ') | %{ "put ""$_""`n" }) | ftp -i -in

보시다시피, 그것은 그 dinky 내장 윈도우 FTP 클라이언트를 사용합니다. 훨씬 짧고 직설적입니다. 예, 실제로 이것을 사용했고 작동했습니다!


다른 방법도 있습니다. 다음 스크립트를 사용했습니다.

$File = "D:\Dev\somefilename.zip";
$ftp = "ftp://username:[email protected]/pub/incoming/somefilename.zip";

Write-Host -Object "ftp url: $ftp";

$webclient = New-Object -TypeName System.Net.WebClient;
$uri = New-Object -TypeName System.Uri -ArgumentList $ftp;

Write-Host -Object "Uploading $File...";

$webclient.UploadFile($uri, $File);

그리고 다음 명령을 사용하여 Windows FTP 명령 행 유틸리티에 대해 스크립트를 실행할 수 있습니다.

ftp -s:script.txt 

( 이 기사를 확인 하십시오 )

그래서 다음 질문에 대한 답변 : FTP 업로드 및 다운로드 스크립트 방법


PowerShell을 통해 파일 업로드를 처리 할 수 ​​있습니다. Github에서 전체 프로젝트를 볼 수 있습니다. https://github.com/edouardkombo/PowerShellFtp

#Directory where to find pictures to upload
$Dir= 'c:\fff\medias\'

#Directory where to save uploaded pictures
$saveDir = 'c:\fff\save\'

#ftp server params
$ftp = 'ftp://10.0.1.11:21/'
$user = 'user'
$pass = 'pass'

#Connect to ftp webclient
$webclient = New-Object System.Net.WebClient 
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)  

#Initialize var for infinite loop
$i=0

#Infinite loop
while($i -eq 0){ 

    #Pause 1 seconde before continue
    Start-Sleep -sec 1

    #Search for pictures in directory
    foreach($item in (dir $Dir "*.jpg"))
    {
        #Set default network status to 1
        $onNetwork = "1"

        #Get picture creation dateTime...
        $pictureDateTime = (Get-ChildItem $item.fullName).CreationTime

        #Convert dateTime to timeStamp
        $pictureTimeStamp = (Get-Date $pictureDateTime).ToFileTime()

        #Get actual timeStamp
        $timeStamp = (Get-Date).ToFileTime() 

        #Get picture lifeTime
        $pictureLifeTime = $timeStamp - $pictureTimeStamp

        #We only treat pictures that are fully written on the disk
        #So, we put a 2 second delay to ensure even big pictures have been fully wirtten   in the disk
        if($pictureLifeTime -gt "2") {    

            #If upload fails, we set network status at 0
            try{

                $uri = New-Object System.Uri($ftp+$item.Name)

                $webclient.UploadFile($uri, $item.FullName)

            } catch [Exception] {

                $onNetwork = "0"
                write-host $_.Exception.Message;
            }

            #If upload succeeded, we do further actions
            if($onNetwork -eq "1"){
                "Copying $item..."
                Copy-Item -path $item.fullName -destination $saveDir$item 

                "Deleting $item..."
                Remove-Item $item.fullName
            }


        }  
    }
}   

share 은 훌륭하게 작동하지만 제시된 바와 같이 "HTTP 프록시를 사용할 때 요청한 FTP 명령이 지원되지 않습니다."라는 오류 메시지가 나타납니다.

$ftp.UsePassive = $true 줄을 추가하면 문제가 해결되었습니다.

$ftp.Proxy = $null;

나는이 일을하고 싶었 기 때문에 잠시 동안 당황했다. 나는 내가 정말로 행복했던 것을 함께 모은다.

DynamicParam에서 ValidateSet 특성을 추가 할 수 있습니다. 다음은 XML 파일에서 ValidateSet을 직접 생성 한 예입니다. 다음 코드에서 "ValidateSetAttribute"를 참조하십시오.

function Foo() {
    [CmdletBinding()]
    Param ()
    DynamicParam {
        #
        # The "modules" param
        #
        $modulesAttributeCollection = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute]

        # [parameter(mandatory=...,
        #     ...
        # )]
        $modulesParameterAttribute = new-object System.Management.Automation.ParameterAttribute
        $modulesParameterAttribute.Mandatory = $true
        $modulesParameterAttribute.HelpMessage = "Enter one or more module names, separated by commas"
        $modulesAttributeCollection.Add($modulesParameterAttribute)    

        # [ValidateSet[(...)]
        $moduleNames = @()
        foreach($moduleXmlInfo in Select-Xml -Path "C:\Path\to\my\xmlFile.xml" -XPath "//enlistment[@name=""wp""]/module") {
            $moduleNames += $moduleXmlInfo.Node.Attributes["name"].Value
        }
        $modulesValidateSetAttribute = New-Object -type System.Management.Automation.ValidateSetAttribute($moduleNames)
        $modulesAttributeCollection.Add($modulesValidateSetAttribute)

        # Remaining boilerplate
        $modulesRuntimeDefinedParam = new-object -Type System.Management.Automation.RuntimeDefinedParameter("modules", [String[]], $modulesAttributeCollection)

        $paramDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary
        $paramDictionary.Add("modules", $modulesRuntimeDefinedParam)
        return $paramDictionary
    }
    process {
        # Do stuff
    }
}

그걸로 입력 할 수 있습니다.

Foo -modules M<press tab>

해당 모듈이 XML 파일에 있으면 "MarcusModule"을 탭 완성합니다. 또한 XML 파일을 편집 할 수 있으며 탭 완성 동작이 즉시 변경됩니다. 함수를 다시 가져올 필요가 없습니다.





powershell ftp