Powershell函数传递了太多参数

时间:2017-08-11 07:47:26

标签: powershell

我正在编写一组PowerShell脚本来监控各种文件夹的大小。我遇到了一个错误,而且我不知道是什么造成的。

以下是代码,其中Write-Host显示了我所期待的内容以及变量$ip$loc实际包含的内容:

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
    }
}

当我运行命令时:

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

我得到了一个错误的"结果,但如果我跑:

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

该命令返回True(应该如此)。

我错过了什么?我已经尝试强制变量设置为:

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

但没有变化。如果它改变了什么,这是在Powershell版本4上。

3 个答案:

答案 0 :(得分:3)

我建议你再多检查一下PowerShell的语法,因为那里有很多错误。 PowerShell与C#完全不同,你似乎做了很多假设。 :)

首先,这不是您调用PowerShell功能的方式。还不确定为什么你在参数周围添加引号?它们是多余的。如果你修复了函数调用,你的代码应该按预期运行。

$mypath = getFullPath $loc $folder

然后在你的switch语句中有一个分号,这也是错误的。然后,如果您只使用$,则无需转义''。中断也是多余的,因为在这种情况下返回退出函数。

"192.168.10.10" { return 'E$' }

此外,关于PowerShell的一个有趣的事情是:你可以摆脱getFullPath中的回报:

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

PowerShell返回未捕获的输出,重要的是要注意,它可能是许多模糊错误的原因。

答案 1 :(得分:2)

问题在于你如何调用你的函数。函数参数在PowerShell中以空格分隔,并且不使用括号括起参数。

getFullPath $loc $folder

当您在括号中包装参数时,您将创建一个包含两个值的数组,并将该数组作为第一个参数传递。

getFullPath($loc, $folder)

这一行传递一个包含两个字符串@($loc, $folder)的数组作为第一个参数,然后,因为该行上没有其他参数,它将$null传递给第二个参数。在函数内部,然后将join数组用作字符串,这是您观察到的行为。

答案 2 :(得分:2)

问题是如何将参数传递给函数。 查看以上链接的更多详情: How do I pass multiple parameters into a function in PowerShell?

<span id="span_guest{$_G[timestamp]}"></span>
<script>
    var guest{$_G[timestamp]}=30;
    function showtimeguest{$_G[timestamp]}(){
        guest{$_G[timestamp]}--;
        document.getElementById('span_guest{$_G[timestamp]}').innerHTML="Next customers will reach on "+Math.floor(guest{$_G[timestamp]}/60)+"minutes"+guest{$_G[timestamp]}%60+"second";
        if(guest{$_G[timestamp]}<=0){
            ajaxget('plugin.php?id=jnshopheroes&ajax=renewguesttime&timestamp={TIMESTAMP}','guestlist');
            ajaxget('plugin.php?id=jnshopheroes&ajax=renewguest&timestamp={TIMESTAMP}&formhash={FORMHASH}','selllist'); 
            clearTimeout(showtimeguest{$_G[timestamp]}); //add here
            clearTimeout(showtimeguest{$_G[timestamp]}()); //add here
        }
        setTimeout("showtimeguest{$_G[timestamp]}()",1000);
    }
    setTimeout("showtimeguest{$_G[timestamp]}()",1000);
</script>