我正在尝试创建将接收参数作为日志文件路径的函数
我希望此参数能够接收字符串路径或用作[switch]
,不带任何参数。
我想要这样做的原因是因为我需要涵盖三个场景,我只想用一个参数来做:
1.参数未通过
2.参数以空参数
传递
3.参数与参数
这是一个演示我想要的脚本:
function myFunc(){
param(
$LogFile = $null
)
# 1. PS > myFunc
if($LogFile -eq $null){
}
# 2. PS > myFunc -LogFile
if($LogFile -eq ""){
}
# 3. PS > myFunc -LogFile "C:\tmp\log.txt"
else{
}
}
是否可以创建可以接收空值和非空值的输入参数?
当我运行myFunc -LogFile
时,我收到错误:
myFunc : Missing an argument for parameter 'LogFile'. Specify a parameter of type 'System.Object' and try again.
At line:1 char:8
+ myFunc -LogFile
+ ~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [myFunc], ParameterBindingException
+ FullyQualifiedErrorId : MissingArgument,myFunc
这是因为它未设置为[switch]
,如果我添加[switch]
,则无法运行myFunc -LogFile c:\tmp\file.txt
:
myFunc : A positional parameter cannot be found that accepts argument 'C:\tmp\file.txt'.
At line:1 char:1
+ myFunc -LogFile C:\tmp\file.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [myFunc], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,myFunc
我还尝试使用[AllowNull()]
和[AllowEmptyString()]
,但他们仍需要一些字符
有关参数的更多信息可以找到{{3}}。
答案 0 :(得分:1)
我不认为你可以有一个像开关一样的参数以及像字符串输入一样。这是因为如果你试图像开关一样使用它,它会抱怨你没有传递任何输入:
myFunc:缺少参数' LogFile'的参数。指定一个 类型参数' System.Object'然后再试一次。
获得您正在寻找的行为的一种方法是将$LogFile
作为开关,然后使用第二个参数来获取字符串(您不需要明确地使用该字符串)声明为输入将通过其调用的顺序转到此参数 - 给予它传递给-LogFile
的印象。这是一个例子:
function myFunc{
param(
[switch]$LogFile,
[string]$LogPath = $null
)
# 1. PS > myFunc
if ($LogFile -eq $false){
"Function used without parameter"
}
# 2. PS > myFunc -LogFile
elseif ($LogFile -eq $true -and -not $LogPath){
"Parameter used like a switch"
}
# 3. PS > myFunc -LogFile "C:\tmp\log.txt"
else{
"Parameter was $LogPath"
}
}
myfunc
myfunc -logfile
myfunc -logfile "C:\tmp\log.txt"
老实说,虽然在这种情况下您想要做的所有事情都有默认路径,但scernario 2并不是必需的。在这种情况下,你可以在param()块中给$ LogPath一个默认值。对参数的实际内容进行误导也可能不是一个好主意(尽管get-help
文档语法块无论如何都会暴露出来。)
答案 1 :(得分:1)
接受$LogFile
作为switch参数,然后如果它存在,只需将它的类型转换为字符串值,并使用以下参数的值填充它(如果存在):
param(
[switch]
$LogFile
)
if($LogFile)
{
#We neeed to change the variable type, so remove it
Remove-Variable -Name "LogFile"
#The remaining arguments are placed in $args array.
if($args.Count -gt 0)
{
$LogFile = [String]$args[0]
}
else {
$LogFile = [String]""
}
}
# 1. PS > myFunc
else {
"# 1. PS > myFunc "
}
# 2. PS > myFunc -LogFile
if($LogFile -eq ""){
"LogFile is empty"
}
# 3. PS > myFunc -LogFile "C:\tmp\log.txt"
elseif ($LogFile -is [String]){
"logFile is $logFile"
}
答案 2 :(得分:-2)
function cookieMonster($ChocolateChipCookie){
if ([string]::IsNullOrEmpty($chocolateChipCookie)){
write-host "Hey wheres my Cookies! "
}
else {
write-host "MMMMM COOKIES! NOM NOM NOM"
}
}
cookieMonster -ChocolateChipCookie C:\cookiejar\cookie.txt
答案 3 :(得分:-2)
这个答案的灵感来自上面的传奇Mark Wragg:
function cookieMonster{
param(
[switch] $ChocolateChipCookie,
[string] $Crumbs = $null
)
# The function without parameters
if($ChocolateChipCookie -eq $false){
write-host "no cookies;("
}
# The parameter is not passed
elseif ($ChocolateChipCookie -eq $true -and -not $Crumbs) {
Write-Host "Aw just crumbs!"
}
# The parameter is passed with argument
else {
write-host "MMMMM COOKIES! NOM NOM NOM"
}
}
cookieMonster -ChocolateChipCookie C:\cookiejar\cookie.txt
$ ChocolateChipCookie被定义为开关参数。 然后将switch参数的值创建为名为$ crumbs的字符串参数。
if块检查是否在没有开关的情况下调用该函数并写入消息。
elseif块检查是否使用没有值的开关调用了该函数。
如果不满足上述条件,则else块会写入消息。