2016-12-12 2 views
1

Есть ли способ получить только локально объявленные переменные в сценарии powershell?Как перечислять все локально объявленные переменные скрипта?

В этом Snippit, я хотел бы его вернуть только myVar1, myVar2, anotherVar:

$myVar1 = "myVar1" 
$myVar2 = "myVar2" 
$anotherVar = "anotherVar" 
Get-Variable -Scope Script 

Но вместо этого он возвращает массу других локальных переменных сценария.

Проблема, которую я пытаюсь решить, и, возможно, вы можете предложить другой способ, заключается в том, что у меня есть много сценариев Powershell, у которых есть куча переменных переменных, объявленных вверху.

Я хочу экспортировать их все на диск (xml) для импорта позже.

Итак, чтобы позвонить Get-Variable bla* | Export-Clixml vars.xml, мне нужно знать все имена переменных.

Так есть способ, которым я могу, как сделать

$allVars = { 
    $myVar1 = "alex" 
    $myVar2 = "iscool" 
    $anotherVar = "thisisanotherVar" 
} 
Get-Variable allVars | Export-Clixml "C:\TEMP\AllVars.xml" 

А потом Import-Clixml .\AllVars.xml | %{ Set-Variable $_.Name $_.Value }?

Чтобы остальная часть скрипта могла использовать $myVar1 и т. Д. Без существенных изменений в том, что уже написано?

+0

'ls variable:' должно быть в порядке? – 4c74356b41

+0

Он получает всевозможные другие переменные, которые я бы не хотел загружать, например, «PWD». –

ответ

2

Проблема в том, что есть больше переменных, которые доступны в этой области действия помимо тех, которые вы уже объявили. Одна вещь, которую вы могли бы сделать, это получить список переменных до, который вы объявляете. Получите еще одну копию всех переменных и сравните список, чтобы просто получить свой.

$before = Get-Variable -Scope Local 
$r = "Stuff" 
$after = Get-Variable -Scope Local 

# Get the differences 
Compare-Object -Reference $current -Difference $more -Property Name -PassThru 

Приведенное выше должно выплюнуть имена и простые значения для ваших переменных. Если нужно, вы должны быть в состоянии легко отправить это вниз по трубе в Export-CliXML. Если ваши переменные сложны, вам может потребоваться изменить -depth для более сложных объектов.

Предостережение: Если вы меняете некоторые значения переменных по умолчанию, то указанный выше код в настоящее время опускает их, поскольку он просто ищет новые имена.

Также не уверен, что вы можете импортировать их точно в том же виде, что и при экспорте. Это во многом зависит от ваших типов данных. Для простых переменных это было бы просто отлично

Мне нужно знать все имена переменных.

Единственный способ, который я знаю (я никогда не считал это) было бы изменить все переменной, чтобы иметь префикс как my_ так, то вы могли бы просто иметь одну строку для экспорта.

Get-Variable my_* | Export-Clixml vars.xml 
+0

Если скрипты не звонят друг другу, вам не нужно записывать '$ before', вы можете просто сравнить' -Scope 0' с '-Scope 1'. Конечно, у него есть своя проблема в том, что он будет ловить измененные переменные тоже (даже если они не были объявлены каким-либо пользовательским скриптом). –

+0

Вот что я понял, что мне нужно будет сделать. Есть ли лучший метод, чем метод XML-Variable для хранения кучи констант для повторного использования? Например, у меня есть один сценарий под названием «RefreshEnvironment», и у нас есть серверы «Test1» и «Test2», где «функция» сценария идентична, но «Test1» имеет разные имена серверов и те же, что и «Test2» –

+0

@ AlexKwitny XML - лучший подход для сложных переменных и объектов. Это больше известно о типе. Кроме того, вы могли бы использовать CSV-файлы, но это было бы полезно только для строк и чисел. – Matt