我有一个接受字符串参数的脚本:
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
两次,第一次抛出异常,但第二次执行时没有错误。
答案 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
将某些内容写入标准输出,导致该函数返回包含所述输出和所需路径的数组。你可以发一下你在那个位置做什么的细节吗?