2011-03-09 18 views
5

Aşağıdaki Python komut miras:Kullanıcı powershell komut dosyasını URL'ye gönderecek?

import urllib2 
a = urllib2.urlopen('http://mysite/mypage.aspx?action=dosomething') 
a.read() 
a.close() 

ve ben bir powershell komut ile değiştirmek istiyoruz. Ben biraz googled ama bulduğum her şey bir tarayıcı penceresi başlattı.

Bu script programlanmış olacak, bu yüzden eğer mümkünse sadece "post and forget" yapmak isterim?

çok minnetle alınan Herhangi bir yardım :)

cevap

6

Coğrafi etiket tweet göndermek için nasıl gösterir Ben bir süre önce yazdığı bir senaryo olduğunu. Bu WebClient kullanır.

http://www.ravichaganti.com/blog/?p=979

kolay başvuru için buraya kodunun.

Function ByPass-Proxy { 
    param ([string]$url) 
    $webClient.Proxy.IsBypassed($url) 
} 

Function Get-GeoCoordinates { 
    param ([String]$location) 
    $baseURL = "http://maps.google.com/maps/geo?q=" 
    $apiKey = "Your API Key" 
    $url = $baseURL + $location + "&output=xml&sensor=false&key=" + $apiKey 
    $locCoords = (([xml]($WebClient.DownloadString($url))).kml.Response.Placemark.Point.coordinates) 
    return $locCoords 
} 

Function Send-Tweet { 
    param ([string]$Tweet,[string]$location) 
    $geoCoord = Get-GeoCoordinates $location 
    $long = $geoCoord.Split(",")[0] 
    $lat = $geoCoord.Split(",")[1] 
    $TwitURL = "http://twitter.com/statuses/update.xml" 
    $WebClient.Credentials = $TwitCredentials 
    #$str = [System.Text.Encoding]::UTF8.GetBytes("status=" + $Tweet + "&lat=" + $lat + "&long=" + $long) 
    $str = "status=" + $Tweet + "&lat=" + $lat + "&long=" + $long 
    [System.Net.ServicePointManager]::Expect100Continue = $false 
    $response = $WebClient.UploadString($TwitURL,$str) 
    $response 
} 

function Get-Credential { 
## Grabbed this from http://poshcode.org/1480 

[CmdletBinding(DefaultParameterSetName="Better")] 
PARAM(
    [Parameter(Position=1,Mandatory=$false)] 
    [Alias("Credential")] 
    [PSObject]$UserName=$null, 
    [Parameter(Position=2,Mandatory=$false)] 
    [string]$Title=$null, 
    [Parameter(Position=3,Mandatory=$false)] 
    [string]$Message=$null, 
    [Parameter(Position=4,Mandatory=$false)] 
    [string]$Domain=$null, 
    [Parameter(Mandatory=$false)] 
    [switch]$GenericCredentials, 
    [Parameter(Mandatory=$false)] 
    [switch]$Inline 
) 

PROCESS { 
    if($UserName -is [System.Management.Automation.PSCredential]) { 
     return $UserName 
    } elseif($UserName -ne $null) { 
     $UserName = $UserName.ToString() 
    } 

    if($Inline) { 
     if($Title) { Write-Host $Title } 
     if($Message) { Write-Host $Message } 
     if($Domain) { 
     if($UserName -and $UserName -notmatch "[@\\]") { 
      $UserName = "${Domain}\${UserName}" 
     } 
     } 
     if(!$UserName) { 
     $UserName = Read-Host "User" 
     if(($Domain -OR !$GenericCredentials) -and $UserName -notmatch "[@\\]") { 
      $UserName = "${Domain}\${UserName}" 
     } 
     } 
     return New-Object System.Management.Automation.PSCredential $UserName,$(Read-Host "Password for user $UserName" -AsSecureString) 
    } 
    if($GenericCredentials) { $Credential = "Generic" } else { $Credential = "Domain" } 

    ## Now call the Host.UI method ... if they don't have one, we'll die, yay. 
    ## BugBug? PowerShell.exe disregards the last parameter 
    $Host.UI.PromptForCredential($Title, $Message, $UserName, $Domain, $Credential,"Default") 
} 
} 

$global:webClient = New-Object System.Net.WebClient 
$global:TwitCredentials = Get-Credential -title "Twitter Credentials" -message "Please enter your Twitter username/password" 
If (!(ByPass-Proxy "http://www.twitter.com")) { 
    $global:Webclient.proxy.Credentials = Get-Credential -title "Proxy Credentials" -message "Please enter username/password for Proxy authentication" 
} 
0

Sen, .NET özellikle UploadString veya UploadValuesWebclient sınıfını kullanabilirsiniz. Bir webclient nesnesi almak için New-Object System.Net.WebClient yapın ve gerisi basit olmalıdır.

6

İşlev urlopen HTTP GET gibi görünüyor. Sonra WebClient kullanabilirsiniz:

$w = New-Object net.webclient 
$w.DownloadString('http://mysite/mypage.aspx?action=dosomething') 

HTTP POST için bu işlevi kullanın:

İşte
function Execute-HTTPPostCommand() 
{ 
    param(
    [string] $url = $null, 
    [string] $data = $null, 
    [System.Net.NetworkCredential]$credentials = $null, 
    [string] $contentType = "application/x-www-form-urlencoded", 
    [string] $codePageName = "UTF-8", 
    [string] $userAgent = $null 
); 

    if ($url -and $data) 
    { 
    [System.Net.WebRequest]$webRequest = [System.Net.WebRequest]::Create($url); 
    $webRequest.ServicePoint.Expect100Continue = $false; 
    if ($credentials) 
    { 
     $webRequest.Credentials = $credentials; 
     $webRequest.PreAuthenticate = $true; 
    } 
    $webRequest.ContentType = $contentType; 
    $webRequest.Method = "POST"; 
    if ($userAgent) 
    { 
     $webRequest.UserAgent = $userAgent; 
    } 

    $enc = [System.Text.Encoding]::GetEncoding($codePageName); 
    [byte[]]$bytes = $enc.GetBytes($data); 
    $webRequest.ContentLength = $bytes.Length; 
    [System.IO.Stream]$reqStream = $webRequest.GetRequestStream(); 
    $reqStream.Write($bytes, 0, $bytes.Length); 
    $reqStream.Flush(); 

    $resp = $webRequest.GetResponse(); 
    $rs = $resp.GetResponseStream(); 
    [System.IO.StreamReader]$sr = New-Object System.IO.StreamReader -argumentList $rs; 
    $sr.ReadToEnd(); 
    } 
} 
6

PowerShell v3 başlayarak, Invoke-WebRequest veya takma iwr kullanabilirsiniz. Eğer çıktıyı gerekiyorsa

iwr 'http://mysite/mypage.aspx?action=dosomething' 

, Python komut ile aynı yanıtın Content özelliğini kullanın. @stej yazdığı gibi

(Invoke-WebRequest 'http://mysite/mypage.aspx?action=dosomething').Content 

, Python kodu bir GET gibi görünüyor, ama sen POST gerekiyor eğer Method parametresini kullanabilirsiniz.

iwr 'http://mysite/mypage.aspx?action=dosomething' -Method Post 
İlgili konular