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

Function PowerShell函数返回类型不符合预期,function,powershell,casting,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

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

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
,它第一次抛出异常,但第二次执行时没有错误。

尝试删除“return”。未保存到变量的输出将自动返回。这应该不会有什么不同,但尝试也不会有什么坏处

你能提供一个完整的例外吗?在没有出现完全异常的情况下,我感觉错误是由脚本中的某些内容(例如函数)引起的

EDIT您的
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
}

我最好的猜测是你的

#do some other stuff with $path

将某些内容写入标准输出,使函数返回包含所述输出和预期路径的数组。您可以发送关于您在该位中执行的操作的详细信息吗?

可以,但是函数返回类型是否受输出返回方式的影响?不应该,但如前所述,尝试不会有什么坏处。有时会发生奇怪的事情。更重要的是。在你的问题中提供一个完整的例外(就像我在回答中要求的那样):-)好的,我修改了我的原始问题,以更全面地表示实际代码(由于许多原因,无法发布实际代码)。我还包括了例外的全文。这还不够。我们需要有关隐藏部分的详细信息。不是你的敏感信息,而是做了什么。例如,您是否在代码的任何部分输出了任何内容(例如使用
$variable
或其他未存储在变量中的函数)?好的,我修改为包含所有相关代码。不,没有输出任何内容。在将其传递给接受字符串参数的脚本之前,在
$path
上调用
GetType
,并查看类型。也许你不小心把它的类型改成了什么,但没有意识到。好吧,我修改了,把所有相关的代码都包括进去了。不,不输出任何内容。这就是:)
mkdir
返回与您刚才创建的文件夹相对应的对象。此对象与返回值($path)一起发送到标准输出。这也解释了为什么第二次执行有效。第二次,文件夹已经存在,因此mkdir没有执行,只有$path被发送到标准输出。糟糕,忘记包含解决方案:p只需在mkdir前面添加
$null=
。这将把mkdir的输出发送到垃圾箱。换句话说:
$null=mkdir$dir
感谢您的解决方案!我假设,在我发布完整的代码后,您和@Graimer都立即注意到了这一点,这是一个常见的PS问题?是的。在尝试创建函数时,您需要非常小心管道中的内容,就像在其他语言中一样。看看这个,这可能会让你对这种行为有更多的了解。