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

ogq8wdun  于 2023-06-24  发布在  Windows
关注(0)|答案(1)|浏览(151)

我试图用PowerShell脚本从ps1文件中读取参数。(使用powershell inputfile.ps1 运行,它正在调用 evaluation.ps1)输入文件如下所示:

$a=5
$b=""
$c=
$d=555

不幸的是,似乎不可能用传统方法检测不存在的变量'c',例如$null-eq ""''-is [string]或类似方法。这导致我的PowerShell脚本自动使用变量'd '中的下一个值。最后,我得到了这样的信息:

echo "$a"
5
echo "$b"

echo "$c"
555
echo "$d"
555

是否有可能避免使用下一行的值或以某种方式检测丢失的输入?不幸的是,不应该触及ps1-input文件(我知道当使用空字符串作为输入时,如b="",所有上述方法都可以正常工作)。
谢谢你的任何帮助提前。
我想我已经在这里尝试了所有的stackoverflow提示,但是因为它不是一个字符串,而是一个空输入,所以什么都不起作用。

oxf4rvwz

oxf4rvwz1#

把它拼出来:您的.ps1脚本 * 与您的意图有关 * 格式不正确,因为:

$c=
$d=555

尽管有换行符,但与$c=$d=555相同,它通过设计将555分配给 * both * $c$d
如果您希望将$c改为$null,则有两个基本选项:

  • (a)* 预处理 * 您的文件,用$null替换=后面的缺失值,然后通过Invoke-Expression执行预处理后的内容,而不是点源化
      • 注意**:鉴于dot-sourcing和Invoke-Expression(即generally to be avoided)允许执行任意代码,请确保您完全控制或隐式信任脚本的内容。
  • (b)* 手动 * 逐行解析文件,并使用Set-Variable逐个定义变量。
(a)的实现

注意事项:

  • 假设任何以=结尾的行也是一个简单的赋值语句,如您的问题所示。
  • -replace操作匹配行尾=(可选择仅跟空格),并将其替换为逐字=$null。这意味着这样的变量仍然是 * 定义 * 的,但值为$null
  • 有关regex(?m)=\s*$)的解释以及使用它进行实验的能力,请参阅this regex101.com page
(Get-Content -Raw yourScript.ps1) -replace '(?m)=\s*$', '=$null' |
  Invoke-Expression

(b)的实现

注意事项:

  • 假设您的脚本文件只包含问题中所示的赋值语句。
  • 赋值值必须是 * literal * 值,而不是需要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
  }

相关问题