正则表达式 – 不使用Invoke-Expression扩展字符串
想象一下以下代码:
# 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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |