Powershell:変数内の変数。変容


5

だから私の問題を説明する最も簡単な方法は私がやろうとしていることのこの単純化されたバージョンをあなたに示すことです。

PS C:\> $a = 'hello'
PS C:\> $a
hello
PS C:\> $b = '$a world!'
PS C:\> $b
$a world!

今、私が本当に欲しいのは$ bを呼び出して 'hello world!'を返すことです。しかし、私はどうやら変数を呼び出すことはできません 内に このような別の変数。誰かが何か提案や回避策を持っていますか?ここでは明らかなことが足りないような気がします。

編集:私がやろうとしていることのより正確なバージョン:

PS C:\> $selHost = (get-content c:\scripts\hosts.txt)[0]
PS C:\> $selhost
spr-it-minion
PS C:\> $a = (get-content c:\scripts\config.txt)[1]
PS C:\> $a
$selhost Is Offline!
PS C:\> $b = "$a"
PS C:\> $b
$selhost Is Offline!

それで、私はhosts.txtから最初の行を抜き出してそれを$ selhostに設定します。これは単に 'spr-it-minion'です。それからconfig.txtから2行目を取り出します。これは単なる文字列「$ selhost is offline!」です。私が$ aを呼び出すときに私は「spr-it-minionはオフラインです」と願っています。私はどうすればいいのかわかりません。

編集II:それぞれhosts.txtとconfig.txtの内容。

hosts.txt:

spr-it-minion
spr-saflok
spr-crosby
spr-vmhost01
spr-vmhost02
spr-vmhost03

config.txt:

172.31.1.124
$selhost Is Offline!
$selhost Is Offline!
example@company.com
example2@company.com

編集III: ペーストビン あなたが興味を持っているなら、私の実際のスクリプトに。

15行目:$ alertSubjectを "$ selhost is offline!"という文字列に設定します。引用符などはありません。

82行目:$ alertSubjectを電子メール警告の件名として使用します。この変数に含まれる変数の値は、「spr-it-minionはオフラインです」のように表記します。しかし、私が電子メールを受け取ったり、スクリプトのどこかに$ alertSubjectを書いてみると、単に "$ selhostはオフラインです!"と表示されます。


hosts.txtからの実際の行[0]とconfig.txtからの行[1]を表示するようにもう一度編集してください。それは助けるでしょう..;)
Ƭᴇcʜιᴇ007

私はPowerShellユーザーではないので、よくわかりませんが、変数を別の変数に代入するときに引用符を使用する必要はまったくないと疑っています。 $a = $b うまくいくはずです。のことを考える " 「ここにあるものを、どんな変数も含めて解凍する」という意味です。誰かがこれが事実であることを確認できますか?
Jarmund

hosts.txtとconfig.txtの内容を含むように編集されました。
Catatonic27

実際のスクリプトへのpastebinリンクと、この問題を引き起こしている分野を含むように編集されました。
Catatonic27

回答:


7

PowerShellで変数を定義するときは、一重引用符( ' )文字列のリテラルバージョンが欲しいという意味です。二重引用符を使用( " )変数展開を許可したい場合は、

PS C:\> $a = "hello"
PS C:\> $a
hello
PS C:\> $b = "$a world!"
PS C:\> $b
hello world!

より詳しい情報:

コメント後に編集:

あなたがファイルから行を引っ張っているあなたの例では、それはリテラル文字列として行を引っ張っているので、それは少しトリッキーです。

最も簡単な方法(IMO)は、 交換する 方法;何かのようなもの:

$selHost = (get-content c:\scripts\hosts.txt)[0]
$a = ((get-content c:\scripts\config.txt)[1]).replace('$selhost', $selHost)

1
注目すべき点は、このシングルクォートとダブルクォートの振る舞いがPowerShellだけでなく、私が知っている賢明な文字列操作を持つ言語であることです。
Jarmund

@ Jarmund私が長年にわたって遭遇したほとんどの「賢明な」言語は、まったく混ぜることを許しません。二重引用符は文字列用、一重引用符はChars用です。この質問はPowerShell固有のものなので、結局それはそれほど重要ではありません。 ;)
Ƭᴇcʜιᴇ007

@ Techie007確かに、これは現時点では多少冗長なので、ここでは説明を省略して説明します。実用的な言語には必ずしも実用的な文字列操作があるとは限りません。 :P
Jarmund

@ Jarmund十分に真実であり、どの言語を使用しているのか、そして何のために使用しているかにもよりますが、どの言語でも「賢明」であるか否かを判断できます。 ;)
Ƭᴇcʜιᴇ007

ありがとうございます。私はプログラミング一般にはかなり慣れていませんし、 'と "はかなり互換性があるという印象を受けました。残念ながら、私は例を単純化しすぎた可能性があります。 PS C:\> $selHost = (get-content c:\scripts\hosts.txt)[0] PS C:\> $selhost spr-it-minion PS C:\> $a = (get-content c:\scripts\config.txt)[1] PS C:\> $a $selhost Is Offline! それで、私はhosts.txtから1行を引き出してそれを$ selhostに設定します。それから、config.txtから「$ selhostはオフラインです」という行を取り出します。私が$ aを呼び出すときに私は「spr-it-minionはオフラインです」と願っています。そして何もない。
Catatonic27
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.