Skruf
Skruf

Reputation: 23

Build URL string

Trying to build a link with a variable and a string, but I always get a space in between them. How can I fix this?

The $sub is a SPWeb object from sharepoint.

Write-Host $sub.Url "/default.aspx"

result:

https://intra.mycompany/pages/sales /default.aspx

Upvotes: 2

Views: 6879

Answers (2)

JohnLBevan
JohnLBevan

Reputation: 24430

Use the URL class' constructor to do the join, rather than using string manipulation. This will have the additional advantage of automatically take care of appending any slashes required.

function Join-Uri {
    [CmdletBinding()]
    param (
        [Alias('Path','BaseUri')] #aliases so naming is consistent with Join-Path and .Net's constructor
        [Parameter(Mandatory)]
        [System.Uri]$Uri
        ,
        [Alias('ChildPath')] #alias so naming is consistent with Join-Path
        [Parameter(Mandatory,ValueFromPipeline)]
        [string]$RelativeUri
    )
    process {
        (New-Object -TypeName 'System.Uri' -ArgumentList $Uri,$RelativeUri)
        #the above returns a URI object; if we only want the string:
        #(New-Object -TypeName 'System.Uri' -ArgumentList $Uri,$RelativeUri).AbsoluteUri
    }
}

$sub = new-object -TypeName PSObject -Property @{Url='http://demo'}

write-host 'Basic Demo' -ForegroundColor 'cyan'
write-host (Join-Uri $sub.Url '/default.aspx')
write-host (Join-Uri $sub.Url 'default.aspx') #NB: above we included the leading slash; here we don't; yet the output's consistent

#you can also easily do this en-masse; e.g.
write-host 'Extended Demo' -ForegroundColor 'cyan'
@('default.aspx','index.htm','helloWorld.aspx') | Join-Uri $sub.Url | select-object -ExpandProperty AbsoluteUri

Above I created a function to wrap up this functionality; but you could just as easily do something such as below:

[string]$url = (new-object -TypeName 'System.Uri' -ArgumentList ([System.Uri]'http://test'),'me').AbsoluteUri

Link to related documentation: https://msdn.microsoft.com/en-us/library/9hst1w91(v=vs.110).aspx

Upvotes: 1

user2555451
user2555451

Reputation:

Put the $sub variable inside the string literal so that it is treated as one string:

Write-Host "$($sub.Url)/default.aspx"

Note that you will need to use a sub expression operator $(...) since you are accessing an attribute of $sub.


Another approach, depending on how complicated your string is, is to use the -f format operator:

Write-Host ("{0}/default.aspx" -f $sub.Url)

If you have many variables that you need to insert, it can make for cleaner and easier to read code.

Upvotes: 3

Related Questions