我是shell的新手,我无法想出这个非常简单的代码并且有一个问题:
我有一个基本脚本c:\ Folder \ abc.ps1:
function abc
{
Param(
[parameter(Mandatory=$false]
$Env
}
Write-Output "The parameter is: $Env"
}
abc $Env
现在从命令行调用此脚本:
C:\Dev> . "c:\Folder\abc.ps1" "Dev"
The parameter is:
C:\Dev> . "c:\Folder\abc.ps1" "Dev"
The parameter is:
现在,如果我初始化Env那么有效;
C:\Dev> $Env = "Dev"
C:\Dev> . "c:\Folder\abc.ps1"
C:\Dev> The parameter is: Dev
我希望从任何位置在上面的一行中进行此操作而不是放置它的文件夹。 我在Windows环境中的Power shell提示符下使用Power shell
感谢您的帮助
答案 0 :(得分:1)
这里有几个选择。
您可以使用以下语句调用来设置$ Env
的值.\abc.ps1 -env "dev"
或者您可以更新代码以提取您传递的未命名参数的值。它们存储在名为$ args。
的数组中function abc
{
}
$env=$args[0]
Write-Output "The parameter is: $env"
abc $env
然后将此函数称为
"c:\Folder\abc.ps1" "Dev"
答案 1 :(得分:0)
您的第一个脚本使用传递的参数 nothing 。这就是为什么你的第一个例子没有净化你期望的输出。 $env
始终为空。
关于该主题,不要将$env
用作变量,因为它与用于环境变量的提供程序相同。虽然与您的问题无关。只是知道这是一个需要避免的事情,因为它可能是未来问题或混乱的原因。
第二次代码调用的原因是使用dot operator。
。点源运营商
在当前范围中运行一个脚本,以便任何函数, 别名和脚本创建的变量将添加到当前 范围。
如果您希望第一个脚本工作,则需要处理参数。 answer by Alec Collier涵盖了一种简单的方法。使用$args
变量。还有其他几个,其中一个值得注意的是param
,正如您在函数中使用的那样。
Param(
[parameter(position=0,
Mandatory=$false)]
$bagel
)
function abc {
Param(
[parameter(Mandatory=$false)]
$value
)
Write-Output "The parameter is: $value"
}
abc $bagel
然后可以像调用脚本一样调用脚本。
. "c:\Folder\abc.ps1" "Dev"
答案 2 :(得分:0)
通过从}
字符到)
字符的简单更改,这似乎是您的错误,您的脚本应该可以正常工作。
我在说这个:
Param(
[parameter(Mandatory=$false]
$Env
} <-------------
注意开放式支架是圆形支架,而不是花括号。通过放置一个大括号,您将关闭该函数,因此无效。