2017-11-16 11 views
0

ユーザー通知を提供する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)." 

...使用するコピー(テキスト)を含有していた二PowerShellのファイルを持っていると思ったので、何かのように編集する行、および潜在的に他の項目を混乱させる/難しいだけです。しかし、私は一回の実行で数千人のユーザーをループするので、すべての$ currentUser ...変数は頻繁に再利用されます。 $ bodyは変数を直ちに取得しようとし、呼び出されるたびに変数の内容を評価するのではなく、静的な文字列として機能するので、これは問題を引き起こします。

$ bodyを1回だけ定義する(つまりループ内ではない)巧妙な方法はありますか?それでも内部変数の再定義は可能ですか?また、複数の部分に分割するのではなく、$ part1 + $ var1 + part2 + var2 .... n + 1回になりました。あなたは、変数を必要なとき

+0

Aで変数を定義しますパラメータ(基本的には関数)を持つスクリプトブロックを作成し、 'それを起動します。 {param($ user)$ var = "$ user"} -user 'thisuser'' – TheIncorrigible1

+0

これはスクリプトパラメータを持つ1つの目的ではありませんか?それとも私はその質問を理解できないのですか? –

+0

@Bill_Stewartパラメータを構成する変数は、スクリプト自体の実行中に取得されます。現時点では、私のスクリプトはかなり短いので、スクリプトは1つの機能ですが、TheIncorrigible1の応答により、2次呼び出しの合理的な選択が検討されています。私は、これが私が参照できる私の 'コピー'変数を含むドットソースの外部ファイルを持つことができるかどうかは分かりませんが、それは一歩です。 –

答えて

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 
} 
関連する問題