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 コマンド ラインから 2 回実行すると、1 回目は例外がスローされますが、2 回目はエラーなしで実行されることです。

4

2 に答える 2

0

「return」を削除してみてください。変数に保存されていない出力は自動的に返されます。違いはありませんが、試してみても問題はありません。

完全な例外を提供できますか?完全な例外を設定しないと、エラーはスクリプト内の何か(関数など)が原因であると感じます。

編集あなた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 に答える