加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 不使用Invoke-Expression扩展字符串

发布时间:2020-12-14 06:03:29 所属栏目:百科 来源:网络整理
导读:想象一下以下代码: # Script Start$WelcomeMessage = "Hello $UserName,today is $($Date.DayOfWeek)"....# 100 lines of other functions and what not.....function Greet-User{ $Username = Get-UserNameFromSomewhereFancy $Date = Get-DateFromSomewhe
想象一下以下代码:

# Script Start
$WelcomeMessage = "Hello $UserName,today is $($Date.DayOfWeek)"

..
..
# 100 lines of other functions and what not...
..

function Greet-User
{
    $Username = Get-UserNameFromSomewhereFancy
    $Date = Get-DateFromSomewhereFancy

    $WelcomeMessage
}

这是一个非常基本的示例,但它试图显示的是一个脚本,其中有一个$WelcomeMessage,运行脚本的人可以在脚本的顶部设置并控制消息显示的方式/内容.

第一件事是第一件事:为什么要做这样的事情?好吧,如果您将脚本传递给多个人,他们可能需要不同的消息.也许他们不喜欢$($Date.DayOfWeek)并希望获得完整的约会.也许他们不想显示用户名,无论如何.

第二,为什么把它放在脚本的顶部?简单.如果您的脚本中有1000行,并且这些消息遍布整个脚本,则会使人们发现并更改这些消息成为一场噩梦.我们已经以局部字符串和东西的形式对静态消息执行此操作,因此除了其中的可变部分之外,这不是什么新鲜事.

所以,现在问题.如果您运行该代码并调用Greet-User(假设用于检索用户名和日期的函数/ cmdlet实际存在并返回正确的内容…)Greet-User将始终返回Hello,今天是.

这是因为当您声明字符串时,在脚本顶部,当$UserName和$Date对象都没有值时,会扩展字符串.

一个潜在的解决方法是使用单引号创建字符串,并使用Invoke-Expression扩展它们.但由于空间的原因,这有点混乱.即:

$WelcomeMessage = 'Hello $env:USERNAME'
Invoke-Expression $WelcomeMessage

这会因为空间而抛出错误,为了使其正常工作,必须将其声明为:

$WelcomeMessage = 'Hello $env:USERNAME'
$InvokeExpression = "`"$WelcomeMessage`""

乱…

此外,还有代码注入形式的另一个问题.由于我们允许用户在没有指定边界的情况下编写自己的欢迎消息,因此阻止他们放入类似的东西是什么…

$WelcomeMessage 'Hello $([void] (Remove-Item C:Windows -Force -Recurse))'

(是的,我知道这不会删除所有内容,但这是一个例子)

虽然这是一个脚本,如果他们可以修改该字符串,他们也可以修改脚本上的其他所有内容,但是我给出的例子是恶意利用脚本性质的人,也可能发生某人意外放入某些内容最终会产生不良后果的字符串.

所以……如果没有使用Invoke-Expression,必须有一个更好的方法,我只是不太喜欢的东西,所以帮助将不胜感激:)

解决方法

将变量嵌入字符串不是创建动态文本的唯一方法,我这样做的方式如下:

$WelcomeMessage = 'Hello {0},today is {1}'

# 100 lines of other functions and what not...

function Greet-User
{
    $Username = Get-UserNameFromSomewhereFancy
    $Date = Get-DateFromSomewhereFancy

    $WelcomeMessage -f $Username,$Date
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读