系统管理员的Powershell URI生成器

系统管理员的Powershell URI生成器,powershell,Powershell,请原谅我的无知-我正在尝试编写一个powershell cmdlet,它接受用户输入并将查询uri构建到API(一个必填项,3个选项)-我有一种大致的想法,我需要使用哈希表作为查询字符串和参数的字典 我正在尝试构建$baseurl+$querystring+'='+$parameter+'&'+$querystring+'='$value(如果不是null) e、 g.https://example.com/api?param1=value¶m2=value 到目前为止,这是非常粗糙的,

请原谅我的无知-我正在尝试编写一个powershell cmdlet,它接受用户输入并将查询uri构建到API(一个必填项,3个选项)-我有一种大致的想法,我需要使用哈希表作为查询字符串和参数的字典

我正在尝试构建
$baseurl+$querystring+'='+$parameter+'&'+$querystring+'='$value(如果不是null)

e、 g.
https://example.com/api?param1=value¶m2=value

到目前为止,这是非常粗糙的,完全不起作用:

            Function Get-commonURI{ #takes 4 params from user
                [CmdletBinding()]
                Param(
                    [Parameter(Mandatory=$true,
                                ValueFromPipeline=$true,
                                ValueFromPipelineByPropertyName=$true)]

                                [String[]]$value1

                                [Parameter(Mandatory=$false,
                                ValueFromPipeline=$true,
                                ValueFromPipelineByPropertyName=$true)]

                                [String[]]$value2,
                                [String[]]$value3,
                                [String[]]$value4 

                ) #end param 
            }
        #put the input into a paramter hash table with the query strings

        $Parameters = @{
            query = 'querysting1', 'querystring2', 'querystring3', 'querystring4'
            values = $value1,$value2.$value2, $value4
        }

        uri = https://example.com/api?

    $HttpValueCollection = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)

    foreach ($Item in $Parameters.GetEnumerator()) {
#I want to append each query passed in on the cli

foreach ($Value in $Item.Value) {
      $ParameterName = $Item.value

      $HttpValueCollection.Add($ParameterName, $Value)}

$Request  = [System.UriBuilder]($Uri)
$Request.Query = $HttpValueCollection.ToString()

invoke-webrequest $Request.Uri

}

我写了一些类似的东西,但它不起作用——我在这方面走对了吗我确信这已经做了一百万次了,但我甚至不知道谷歌应该做什么——有些东西告诉我,我不应该用变量设置哈希表。谢谢你的关注。

我一直很喜欢不重新发明轮子:

$ub = new-object System.UriBuilder -argumentlist 'http', 'myhost.com', 80, 'mypath/query.aspx', '?param=value'
$ub.Uri.AbsoluteUri
>>>> http://myhost.com/mypath/query.aspx?param=value
更新:

这是一个内置的.NET类,它有许多构造函数。上面的一个接受协议、主机、端口号、路径和查询字符串。它似乎处理一个空的或空的查询字符串,所以不需要自己处理。有关信息,可以查看类的构造函数。为了从用户检索输入,您可以使用读取主机,例如:

[String] $Local:strServer = '';
[String] $Local:strPath   = '';
[String] $Local:strQuery  = '';
[String] $Local:strUri    = '';

while ( $strServer -eq '' ) {
    $strServer = Read-Host -Prompt 'Please enter a server name';
    } #while
while ( $strPath -eq '' ) {
    $strPath   = Read-Host -Prompt 'Please enter a path';
    } #while

# Get query string and ensure it begins with a "?".
$strQuery  = Read-Host -Prompt 'Please enter a query string';
if ( ($strQuery -ne '') -and (! $strQuery.StartsWith('?')) ) { $strQuery = '?' + $strQuery; } 

try {
    $strUri = [System.UriBuilder]::new( 'http', $strServer, 80, $strPath, $strQuery );
    Write-Host -Object ( 'URI is {0}' -f $strUri );
    } #try
catch [System.ArgumentException] {
    # Something went wrong.
    } #catch

最后,我编写了一个cmdlet,它接受管道输入并可以从其他脚本调用—它可以在浏览器中打开uri,将xml另存为文档,或将文档转换为xml类型的对象—这非常方便,因为您可以选择xml对象属性(xml节点、属性)使用虚线表示法代替xPath和Powershells intellisense使用制表符完成,因此您可以在命令行或Powershell ISE中循环遍历xml节点

我还使用powershell社区扩展模块 因为它是明智的join-string cmdlet

Add-Type -AssemblyName System.Web
$authparam = '&auth='
$baseURI = 'https://example.com/restapi?'
$password = 'plaintextpassword'

Function Get-APICommon
{
    #takes 4 params and auth key
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $false,
                   ValueFromPipeline = $true,
                   ValueFromPipelineByPropertyName = $true)]
        [String[]]$param1,
        [String[]]$Param2,
        [String[]]$Param3,
        [String[]]$Param4

    ) #end param 

    Begin { }
    process
    {

        $Parameters = [ordered] @{
            Query1 = $Param1
            Query2 = $Param2
            Query3 = $Param3
            Query4 = $Param4
        }
        #This particular API needs to have query parameters separated by ':' and hashed as part of the authentication parameter i.e param1:param2:param3:param4:password
        $preauth = ($Parameters.GetEnumerator() | % { "$($_.Value)" }) -join ':'

        $prehash = Join-String $preauth, ':', $password
        $hash = $prehash | Get-Hash -Algorithm SHA1 -StringEncoding ascii


        foreach ($item in $Parameters.GetEnumerator())
        {

            if ($item.value -ne $null)
            {

                $query =[System.Web.HttpUtility]::ParseQueryString($uriBuilder.Query)
                $query[$item.key] = $item.Value

                $uriBuilder = [System.UriBuilder]::new($baseURI)
                $uriBuilder.Query = $query.ToString()
                $baseURI = $uriBuilder.ToString()
            }



        }

        $queryURI = Join-String $baseURI, $authparam, $hash
        Write-Host $queryURI


    $Resultfile = Join-String $($Parameters.Query1),'-Result.xml'

    $Resultxml = [xml](Invoke-WebRequest -Uri $queryURI | Select-Object -ExpandProperty content | Out-File $Resultfile)

    $Parameters.Clear()


        $Browser = new-object -com internetexplorer.application

        $Browser.navigate2("$queryURI")

        $Browser.visible = $true


    }


}
示例用法

获取apicomon-param1查询字符串

获取APICommon-param1 queryvalue1-param2 queryvalue2

示例结果

https://example.com/restapi?&query1=queryvalue&query2=queryvalue2&auth=JSJAUJQJALF09OLQLS34LLK

谢谢Simon,您能详细说明一下吗,特别是关于用户输入,如果参数为null,则不追加查询字符串。谢谢。很好的一个谢谢,现在在Mac上,但是明天我会尝试这个,让你知道,一旦我尝试了,我会接受答案!再次感谢。
方法调用失败,因为[System.UriBuilder]不包含名为“new”的方法。
这不是您在PowerShell中构造.NET对象的方式。您好,您的代码没有按原样运行,并且没有很好的缩进,因此很难阅读和理解。你能试着修一下吗?例如,我认为第一个结束的花括号放错了位置,因为它结束了函数声明块。如果我试图改变现状,恐怕我会打破你的逻辑。此外,如果您想获取用户输入,可以尝试使用:
$userValue1=Read Host“enter first value”
例如。感谢sodawillow,我只是想了解如何使用哈希表构建查询字符串,而不是真正查找代码本身,我想将其构建为cmdlet,这样用户就可以对参数进行制表,而无需提示,因此
get commonURI-param1 value
get commonURI-param1 value-param2 value
cmdlet应该构建正确的uri