Triki z PowerShellem #2 – Szybki upload

2008-05-24 12:52

Oto zadanie: mamy plik, który chcemy komuś przesłać przez Internet i mieć przy tym jak najmniej zawracania głowy. Jest oczywiście e-mail, są komunikatory, podprotokół IRC-a o nazwie DCC serwisy typu RapidShare, itd. Każdy z tych sposobów wymaga jednak albo wymiany jakichś informacji typu adres czy numer identyfikacyjny, albo nie zawsze chce działać w różnych konfiguracjach sieci (zwłaszcza gdy jedna ze stron jest ukryta za NAT-em), albo… wymaga wpatrywania się w literki celem odróżnienia psów od kotów :)
Jeśli jednak dysponujemy serwerem FTP z zawartością dostępną przez HTTP (czyli po prostu hostingiem strony WWW), to możemy dzielić się plikami w prostszy i szybszy sposób. W tym celu posłużyć się można odpowiednim skryptem w PowerShellu, który potrafi samodzielnie połączyć się z serwerem FTP i wgrać na niego podany plik, a potem zwrócić jego URL. Następnie możemy przekazać go osobie, której chcemy przekazać plik.

  1. # Send.ps1 - wysyła podany plik na serwer FTP i zwraca jego adres HTTP
  2. # Parametr: nazwa pliku lokalnego
  3. param([string]$file = $(throw "File not specified"))
  4. $filename = (New-Object IO.FileInfo @($file)).Name
  5.  
  6. # Stałe
  7. $SERVER = "moj.server.pl"
  8. $FTP_LOGIN = "loginFtp"
  9. $FTP_PASS = "hasłoFtp"
  10. $FTP_PATH = "/public_html/pub/upload/" # Ścieżka FTP do katalogu z uploadami
  11. $HTTP_PATH = "/pub/upload/" # Ścieżka HTTP do tego samego katalogu
  12.  
  13. # Odczytujemy plik
  14. $stream = New-Object IO.FileStream @($file, [IO.FileMode]::Open,
  15.     [IO.FileAccess]::Read, [IO.FileShare]::Read)
  16. $content = New-Object byte[] @($stream.Length)
  17. $stream.Read($content, 0, $content.Length) | Out-Null
  18. $stream.Close()
  19.  
  20. # Uploadujemy na FTP
  21. $url = "ftp://" + $SERVER + $FTP_PATH + $filename
  22. $ftp = [Net.FtpWebRequest]::Create($url)
  23. $ftp.Credentials = New-Object Net.NetworkCredential @($FTP_LOGIN, $FTP_PASS)
  24. $ftp.Method = [Net.WebRequestMethods+Ftp]::UploadFile
  25. $ftp.ContentLength = $content.Length
  26. $req = $ftp.GetRequestStream()
  27. $req.Write($content, 0, $content.Length)
  28. $req.Close()
  29.  
  30. # Kopiujemy URL do schowka
  31. # (działa w Windows Vista i 2003 Server; niżej opis alternatywy dla XP)
  32. "http://" + $SERVER + $HTTP_PATH + $filename | clip

Całkiem zmyślnie, prawda? Wystarczy jedynie odczytać lokalny plik, a następnie użyć .NET-owej klasy System.Net.FtpWebRequest w celu wykonania “żądania FTP” w postaci uploadu tegoż pliku na serwer.

Co jednak zrobić z takim skryptem, aby był użyteczny?… Jako że jego parametrem jest ścieżka do lokalnego pliku, który chcemy załadować, możemy użyć następującej komendy:

  1. powershell -Command . 'C:\Sciezka\Do\Skryptu\Send.ps1' '%1'

w celu jego wywołania – o ile potrafimy sprawić, by system Windows zamienił nam symbol zastępczy %1 na rzeczoną ścieżkę. Jest to możliwe przynajmniej na dwa sposoby:

  1. Menu Wyślij do z dodaną komendę uploadu FTPMożemy dodać nowe polecenie do podmenu kontekstowego Wyślij do, wyświetlanego dla każdego pliku w Eksploratorze Windows. W tym celu wystarczy stworzyć plik wsadowy (.bat) w katalogu SendTo, zawierający powyższą komendę, i nazwać go odpowiednio intuicyjnie. Po odświeżeniu Eksploratora, we wspomnianym menu pojawi się nowa pozycja, której wybór uruchomi nam nasz skrypt dla wybranego pliku.
  2. Innym wyjściem jest po prostu dodać nową akcję dla każdego typu plików, przez co będzie ona wyświetlania w głównym menu kontekstowym, obok innych: Otwórz, Edytuj, Drukuj, itd. Aby tego dokonać, najwygodniej jest po prostu otworzyć Edytor Rejestru i przejść do klucza HKEY_CLASSES_ROOT/*/shell. Tworzymy tam nowy podklucz, nazywając go jakoś odpowiednio (np. upload) i wpisując jako wartość domyślną tekst polecenia, który chcemy zobaczyć w menu (np. Upload). Następnie tworzymy tam podklucz command, ustawiając jego wartość domyślną na polecenia uruchomienia skryptu. Odświeżamy Eksplorator i mamy już nowe polecenie w menu kontekstowym.

Dodawanie akcji uploadu dla wszystkich plików w RejestrzeSprytne i wygodne. I kto teraz powie, że tylko w systemach linuksowych można bezustannie kombinować, by dostosowywać je do swoich potrzeb ;-)

PS. Użyty w skrypcie program clip jest bardzo prosty: kopiuje on po prostu swoje wejście do Schowka. Niestety, to malutkie narzędzie nie jest obecne w Windows XP. Nie ma tam więc prostego sposobu na wpisanie tekstu do Schowka z poziomu PowerShella. Alternatywą jest wypisanie URLa- do załadowanego pliku bezpośrednio w oknie konsoli PSh. Wystarczy po prostu zmienić clip na Out-Host, a także zmienić wywołanie skryptu, dodając parametr -NoExit:

  1. powershell -NoExit -Command . 'C:\Sciezka\Do\Skryptu\Send.ps1' '%1'

To sprawi, że o wykonaniu operacji konsola PowerShella pozostanie otwarta wraz z wypisanym w niej URL-em, który można z niej skopiować.

Be Sociable, Share!
Be Sociable, Share!
Tags: ,
Author: Xion, posted under Applications, Internet »


5 comments for post “Triki z PowerShellem #2 – Szybki upload”.
  1. Netrix:
    May 24th, 2008 o 15:48

    Fajny sposób, swego czasu zrobiłem mały programik podobny do screenupa, który wysyła pliki na podany wcześniej serwer. (kliknij w nick :P). Najlepiej działa z serwerami republiki, które można szybko założyć. (polecam zaznaczenie opcji nie sprawdzaj miejsca, ponieważ za za każdym razem oblicza zajęte miejsce).

  2. mtz:
    May 25th, 2008 o 21:16

    A ja pod wpływem twojego posta napisałem swój program do uploadowania :)
    http://mt-z.ovh.org/?p=12

  3. Netrix:
    September 14th, 2008 o 23:20

    Po przestudiowaniu tej notki (w ramach nauki ofc :D) znalazłem błąd:

    powershell -Command . “C:\Sciezka\Do\Skryptu\Send.ps1” “%1″

    powinno być

    powershell -Command . ‘C:\Sciezka\Do\Skryptu\Send.ps1’ ‘%1’

    ponieważ Powershell zawartość między ” oznacza jako cały string a w “” dochodzi do spacji.

  4. przemo:
    June 17th, 2010 o 16:10

    niestety FTP w trybie aktywnym tez nie jest odporny na prace za natem.

Comments are disabled.
 


© 2023 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.