检测Powershell参数列表中的空变量或避免使用下一个字符串输入

问题描述 投票:0回答:1

我正在尝试使用 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 中的所有提示,但由于它不是字符串而是空输入,所以没有任何效果。

windows powershell variables ps1
1个回答
1
投票

说明一下:您的

.ps1
脚本相对于您的意图格式错误,因为:

$c=
$d=555

尽管有换行符,但与

$c=$d=555
相同,根据设计将
555
分配给
$c
$d

如果您希望

$c
变为
$null
,您有两个基本选项:

  • (a) 预处理您的文件,以用

    =
    替换
    $null
    之后的缺失值,然后通过 Invoke-Expression
     执行预处理的内容,而不是 
    点源

    • 注意:鉴于点源和
      Invoke-Expression
      通常要避免)允许执行任意代码,请确保您完全控制或隐式信任脚本的内容。
  • (b) 手动逐行解析文件,并使用

    Set-Variable
    逐一定义变量。

(a)的实施

注:

  • 假设任何以

    =
    结尾的行也是一个简单的赋值语句,如您的问题所示。

  • -replace
    操作匹配行结尾
    =
    (可选地仅后跟空格),并将其逐字替换为
    =$null
    。这意味着这些变量仍然是已定义,但其值是
    $null

(Get-Content -Raw yourScript.ps1) -replace '(?m)=\s*$', '=$null' |
  Invoke-Expression

(b)的实施

注:

  • 假设您的脚本文件包含only赋值语句,如您的问题所示。
  • 赋值值必须是文字值,而不是需要 PowerShell 解释的值。
  • 从好的方面来说,这种方法可以防止执行任意代码。
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
  }
© www.soinside.com 2019 - 2024. All rights reserved.