我正在尝试使用 Powershell 脚本从 ps1 文件中读取参数。 (使用正在调用 evaluation.ps1 的 powershell inputfile.ps1 运行)输入文件如下所示:
#There are also some comments
$a=5
$b=""
$c=
$d=555
不幸的是,使用传统方法(例如
$null
、-eq ""
、''
、-is [string]
或类似方法)似乎不可能检测到不存在的变量“c”。最终我的 Powershell 脚本自动使用变量“d”中的下一个值。所以最后我得到了这个信息:
echo "$a"
5
echo "$b"
echo "$c"
555
echo "$d"
555
是否有可能避免使用下一行的值或以某种方式检测丢失的输入?不幸的是,不应触及 ps1 输入文件(我知道当使用像 b="" 这样的空字符串作为输入时,上述所有方法都可以正常工作)。
感谢您提前提供的任何帮助。
我想我已经在这里尝试了 stackoverflow 中的所有提示,但由于它不是字符串而是空输入,所以没有任何效果。
说明一下:您的
.ps1
脚本相对于您的意图格式错误,因为:
$c=
$d=555
尽管有换行符,但与
$c=$d=555
相同,根据设计将 555
分配给 $c
和 $d
。
如果您希望
$c
变为 $null
,您有两个基本选项:
(a) 预处理您的文件,以用
=
替换 $null
之后的缺失值,然后通过 Invoke-Expression
执行预处理的内容,而不是 点源 它
Invoke-Expression
(通常要避免)允许执行任意代码,请确保您完全控制或隐式信任脚本的内容。Set-Variable
逐一定义变量。
注:
假设任何以
=
结尾的行也是一个简单的赋值语句,如您的问题所示。
-replace
操作匹配行结尾 =
(可选地仅后跟空格),并将其逐字替换为 =$null
。这意味着这些变量仍然是已定义,但其值是$null
。
(?m)=\s*$
) 的说明以及对其进行实验的能力,请参阅 此 regex101.com 页面。(Get-Content -Raw yourScript.ps1) -replace '(?m)=\s*$', '=$null' |
Invoke-Expression
注:
Get-Content yourScript.ps1 |
ForEach-Object {
$name, $value = $_ -split '=', 2
if ($value -eq '') { $value = $null }
else { $value = $value.Trim('"') }
Set-Variable -Name $name.TrimStart('$') -Value $value
}