2013-12-03 7 views
1

У меня есть следующие переменные:Вычислить переменную внутри переменной в Powershell

[string]$eth_netmask = "ext_netmask" 
[string]$ext_netmask = "255.255.252.0" 

$($eth_netmask) возвращается ext_netmask. Я ожидал 255.255.252.0

Что я делаю неправильно?
Спасибо за помощь заранее!

+0

Что вы пытаетесь достичь ? – mjolinor

ответ

4

Команда $eth_netmask возвращает значение переменной с именем eth_netmask. Выражение $(something) не имеет ничего общего с переменными, но вместо этого оценивает содержимое круглых скобок, прежде чем оценивать остальную часть инструкции. Это означает, что оператор $($eth_netmask) будет оценивать в два этапа: 1: $($eth_netmask) вычисляет команду "ext_netmask" 2: "ext_netmask" оценивает как команда, которая имеет результат печати ext_netmask к выходу.

Этот формат не нужен, поскольку в любом случае переменные обычно разрешаются до остальной команды. Моя рекомендация заключалась бы в том, чтобы избежать необходимости делать это вообще, если есть какая-либо альтернатива. Включение такого рода ссылок на круговое движение в кусок кода может вызвать проблемы. Однако, если вы не можете избежать этого по какой-либо причине, можно ссылаться на переменную, имя которой хранится в другой переменной.

[string]$eth_netmask = "ext_netmask" 
[string]$ext_netmask = "255.255.252.0" 

Get-Variable -Name $eth_netmask -ValueOnly 

Это точка, при которой синтаксис $(something) становится полезным. Если вам нужно использовать значение, которое вы только что вернулся в другую команду, например, если значение было внутрибрюшинно, что вы пытаетесь пинг, вы могли бы сделать что-то вроде этого:

Test-Connection $(Get-Variable -Name $eth_netmask -ValueOnly) 
+0

Это потрясающе. Вы исправили мою проблему. Я понимаю, что то, что я делаю, нестандартно, но это единственный способ, которым я знал, как заставить функцию работать. В случае, если вам интересно. Вот реальный код. Я просто пытался оттолкнуть мою настоящую проблему! – user3059424

+0

для ($ индекс = 0; $ индекс -lt $ numInterfaces; $ индекс ++) { $ у = $ индекс + 1 $ destconffile = "$ DESTDIR \ ifcfg-ETH $ Индекс" $ eth_vlanname = $ headernames [ $ у] $ eth_vlanid = "$ ($ eth_vlanname) _vlanid" $ eth_netmask = "$ ($ eth_vlanname) _netmask" Copy-Item ifcfg-ethx $ destconffile (Get-Content $ destconffile) | foreach-object {$ _ -replace "ethx", "eth $ index"} | набор-контента $ destconffile – user3059424

+0

[строка] $ IPADDR = $ valuesnames [$ у] надстройку содержание $ destconffile "' nIPADDR = $ IPADDR" [строка] $ realnetmask = Get-переменная $ -Name eth_netmask -ValueOnly добавить -content $ destconffile "' nNETMASK = $ realnetmask " } – user3059424

Смежные вопросы