Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell function being passed too many parameters

Tags:

powershell

I'm writing a set of PowerShell scripts to monitor the size of various folders. I've run into an error, and I've got no idea what's causing it.

Here is the code, with Write-Host showing what I am expecting and what the variables $ip and $loc actually contain:

function getDriveLetter($ip) {
    Write-Host $ip    # prints:   192.168.10.10 myfolder1\myfolder2\
                      # expected: 192.168.10.10
    switch($ip) {
        "192.168.10.10" {return "E`$"; break}
        "192.168.10.20" {return "D`$"; break}
        default {"Unknown"; break}
    }
}

function getFullPath($loc,$folder) {
    Write-Host $loc    # prints:   192.168.10.10 myfolder1\myfolder2\
                       # expected: 192.168.10.10
    $drive = getDriveLetter("$loc")
    $str = "\\$loc\$drive\DATA\$folder"
    return $str
}

function testPath($loc,$folder) {
    $mypath = getFullPath("$loc","$folder")
    if (Test-Path $mypath) {
        return $true
    } else {
        return $false
    }
}

When I run the command:

testPath("192.168.10.10","myfolder1\myfolder2\")

I'm getting a "False" result, but if I run:

Test-Path "\\192.168.10.10\E`$\DATA\myfolder1\myfolder2\"

The command returns True (as it should).


What have I missed? I've tried forcing the variables to be set with:

$mypath = getFullPath -loc "$loc" -folder "$folder"

but there's no change. If it changes anything, this is on Powershell version 4.

like image 216
Scott Gardner Avatar asked Jun 17 '26 21:06

Scott Gardner


1 Answers

I'd suggest that you review the syntax of PowerShell a bit more, because there's many mistakes in there. PowerShell is quite different from C# and you seem to make a lot of assumptions. :)

First of all, that's not how you call PowerShell functions. Also not sure why you added quotes around the parameters? They are redundant. If you fix the function calls your code should function as expected.

$mypath = getFullPath $loc $folder

Then there's a semicolon in your switch statement, which is also wrong. Then, you don't have to escape the $ if you just use ''. The break is also redundant because return exits the function in this case.

"192.168.10.10" { return 'E$' }

Also, one interesting thing about PowerShell: You could just get rid of the return in getFullPath:

function getFullPath($loc, $folder) {
    $drive = getDriveLetter($loc)
    "\\$loc\$drive\DATA\$folder"
}

PowerShell returns uncaptured output, which is important to be aware of, it can be the cause of many obscure bugs.

like image 95
Thomas Glaser Avatar answered Jun 20 '26 19:06

Thomas Glaser