使用时评估的字符串变量

时间:2017-11-16 16:34:39

标签: string powershell

我正在设置Powershell脚本以提供一些用户通知。该通知具有法律性质,可能会不时更新/更改,因此必须相当容易找到。它还有一些填空的空白'取决于接收通知的人的变量。

我想要一个包含要使用的副本(文本)的辅助Powershell文件,所以像......

$body = "By accessing this system, you agree that your name ($currentUserName) and IP address ($currentUserIPAddr) will be recorded and stored for up to ($currentUserRetentionPeriod)."

可以根据需要更新文件,而无需实际打开脚本,找到要编辑的行,并可能搞乱其他项目/只是很难。但是,我在一次执行中循环遍历数千个用户,因此所有$ currentUser ...变量将经常重复使用。这会产生一个问题,因为$ body会立即尝试获取变量并充当静态字符串,而不是在每次调用变量内容时对其进行评估。

我是否有一种聪明的方法可以一次定义$ body(即不在循环内)但仍允许重新定义内部变量?我也不愿意将字符串分成多个部分,因此它变为$ part1 + $ var1 + part2 + var2 .... n + 1次。

1 个答案:

答案 0 :(得分:0)

一个简单的方法就是只要在需要变量时对包含副本的脚本进行点源处理"重新编译":

BodyDef.ps1

$body = "By accessing this system, you agree that your name ($currentUserName) and IP address ($currentUserIPAddr) will be recorded and stored for up to ($currentUserRetentionPeriod)."

Send-Notification.ps1

$bodyDefPath = (Join-Path $PSScriptRoot BodyDef.ps1)
foreach($user in Get-Users){
    $currentUserName = $user.UserName
    $currentUserIPAddr = $user.IPAddress
    $currentUserRetentionPeriod = $user.RententionPeriod
    . $bodyDefPath
    Send-MailMessage -Body $body
}

上面的工作会很好,但它并不是非常强大的惯用语,有点傻,一遍又一遍地阅读文件。

正如评论中所建议的那样,如果要重复使用具有不同值的相同模板,则应定义第二个函数(或仅仅是一个脚本块):

Send-Notification.ps1

# You could as well define this as a function, doesn't make much difference
$NotificationSender = {
    param($User)

    $body = "By accessing this system, you agree that your name ($($user.UserName)) and IP address ($($user.IPAddress)) will be recorded and stored for up to $($user.RetentionPeriod)."
    Send-MailMessage -Body $body
}

foreach($user in Get-Users){
    & $NotificationSender -user $user
}