PowerShell函数返回类型不符合预期

时间:2013-03-03 02:50:28

标签: function powershell casting

我有一个接受字符串参数的脚本:

script-that-takes-string-param.ps1 

param(
    [Parameter(Mandatory=$true, HelpMessage="path")]
    [string]$path,
)

我还有另一个调用第一个脚本的脚本:

parent-script.ps1 

function CreateDir($dir) {
    if (!(Test-Path $dir)) {
        mkdir $dir
    }
}

function CreatePath($BaseDir, $Environment, $Site, $Domain){     
    $path = [string]::format("{0}{1}\{2}\{3}", $BaseDir, $Environment, $Site, $Domain)
    CreateDir $path
    $path
}

$path = CreatePath 'c:\web\' 'qa' 'site1' 'com'

.\script-that-takes-string-param.ps1 -path $path

运行此脚本会引发异常:

"Cannot process argument transformation on parameter 'path'. Cannot convert value to type System.String"

投射参数不起作用:

.\script-that-takes-string-param.ps1 -path [string] $path

并且转换函数结果也不起作用:

$path = [string] CreatePath 'global' 'site1'

但真正奇怪的是,如果我从PS命令行运行parent-script.ps1两次,第一次抛出异常,但第二次执行时没有错误。

2 个答案:

答案 0 :(得分:0)

尝试删除“返回”。将自动返回未保存到变量的输出。它不应该有任何区别,但尝试不会有什么坏处。

你能提供完整的例外吗?如果没有查看完整的异常,我会感觉错误是由脚本内部的某些内容引起的(例如函数)。

编辑您的mkdir导致了问题。当你运行它时,它返回一个表示所创建目录的对象(如果我没记错的话,是一个DirectoryInfo对象)。要解决此问题,请尝试:

function CreateDir($dir) {
    if (!(Test-Path $dir)) {
        mkdir $dir | out-null
    }
}

或将它们组合起来:

function CreatePath($BaseDir, $Environment, $Site, $Domain){     
    $path = [string]::format("{0}{1}\{2}\{3}", $BaseDir, $Environment, $Site, $Domain)

    if(!(Test-Path $path -PathType Container)) {
        New-Item $path -ItemType Directory | Out-Null
    }

    $path
}

答案 1 :(得分:0)

我最好的猜测是你的

#do some other stuff with $path

将某些内容写入标准输出,导致该函数返回包含所述输出和所需路径的数组。你可以发一下你在那个位置做什么的细节吗?