0

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

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'

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

4

2 回答 2

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
}
于 2013-03-03T12:29:41.613 回答
0

我最好的猜测是你的

#do some other stuff with $path

将某些内容写入标准输出,导致函数返回一个数组,其中包含所述输出和您期望的路径。你能发送关于你在那段时间里所做的事情的详细信息吗?

于 2013-03-04T10:04:09.420 回答