Как в Powershell установить значения переменных внутри функции и сделать это значение доступным в родительской области?
Я пытаюсь установить значения некоторых переменных с помощью функции. Мой код ниже:
$BackupFile = $null $TaskSequenceID = $нуль $OSDComputerName = $null $capturedWimPath = $null Функция Set-OsToBuild { переключатель ($OsToBuild) { "Вин7х64" { $BackupFile = "Win7x64-SP1.wim" $TaskSequenceID = "WIN7X64BC" $OSDComputerName = "Ref-Win7x64" $capturedWimPath = "$($PathToMdtShare)\Captures\$BackupFile" } } }
Проблема в том, что эти значения для $BackupFile, $TaskSequenceID, $OSDComputerName и $capturedWimPath являются пустыми/нулевыми вне этой функции.
Как правильно это сделать? Я хочу установить эти значения в этой функции и сделать эти значения доступными позже в сценарии в родительской области.
- функция
- переменные
- powershell
- область действия
1
Переменные создаются в
области действия вашей функции. Эти переменные удаляются, когда ваша функция выполнена.
Глобальный: Область, которая действует, когда Windows PowerShell начинается. Переменные и функции, присутствующие при Запуски Windows PowerShell были созданы в глобальный охват. Сюда входят автоматические переменные и переменные предпочтений. Это также включает в себя переменные, псевдонимы, и функции, которые находятся в вашей Windows PowerShell профили. Местный: Текущая область. Локальная область может быть глобальной. сфера или любая другая сфера. Скрипт: Область, которая создается во время выполнения файла скрипта. Только команды в скрипте выполняются в области скрипта. К команды в сценарии, областью действия сценария является локальная объем.
Источник: about_Scopes
Если вам нужно, чтобы переменные были доступны для скрипта, то пропишите их в область скрипта
.
$BackupFile = $null $TaskSequenceID = $нуль $OSDComputerName = $null $capturedWimPath = $null Функция Set-OsToBuild { переключатель ($OsToBuild) { "Вин7х64" { $script:BackupFile = "Win7x64-SP1. wim" $script:TaskSequenceID = "WIN7X64BC" $script:OSDComputerName = "Ref-Win7x64" $script:capturedWimPath = "$($PathToMdtShare)\Captures\$BackupFile" } } }
Если вы хотите сохранить значения для целых сеансов (пока вы не закроете процесс powershell), вам следует использовать глобальную область
.
$global:BackupFile = $null $global:TaskSequenceID = $null $global:OSDComputerName = $null $global:capturedWimPath = $null Функция Set-OsToBuild { переключатель ($OsToBuild) { "Вин7х64" { $global:BackupFile = "Win7x64-SP1.wim" $global:TaskSequenceID = "WIN7X64BC" $global:OSDComputerName = "Ref-Win7x64" $global:capturedWimPath = "$($PathToMdtShare)\Captures\$BackupFile" } } }
Справочный документ powershell about_scope
— это то, что вы хотите прочитать для этого.
Конкретно в этом разделе:
Области Windows PowerShell
Области в Windows PowerShell имеют как имена, так и номера. Названный области определяют абсолютную область. Цифры относительны и отражают отношения между областями. Глобальный: Область, которая действует, когда Windows PowerShell начинается. Переменные и функции, присутствующие при Запуски Windows PowerShell были созданы в глобальный охват. Сюда входят автоматические переменные и переменные предпочтений. Это также включает в себя переменные, псевдонимы, и функции, которые находятся в вашей Windows PowerShell профили. Местный: Текущая область. Локальная область может быть глобальной. сфера или любая другая сфера. Скрипт: Область, которая создается во время выполнения файла скрипта. Только команды в скрипте выполняются в области скрипта. К команды в сценарии, областью действия сценария является локальная объем. Частный: Элементы в частной области не могут быть видны за пределами текущего объем. Вы можете использовать частную область для создания частной версии элемента с тем же именем в другой области. Пронумерованные области: Вы можете обращаться к областям по имени или номеру, который описывает относительное положение одного прицела по отношению к другому. Область 0 представляет текущую или локальную область. Область 1 указывает непосредственную родительскую область. Область 2 указывает на родитель родительской области и так далее. Пронумерованные области полезны, если вы создали много рекурсивных масштабы.
Таким образом, в зависимости от ваших конкретных потребностей вы можете использовать любой из следующих вариантов.
-
$global:BackupFile = "Win7x64-SP1.wim"
-
$script:BackupFile = "Win7x64-SP1.wim"
-
$1:BackupFile = "Win7x64-SP1.wim"
Чтобы установить $BackupFile
снаружи, ваша функция должна записать в $script:$BackupFile
.
Но есть одна загвоздка! Если ваш скрипт вызывается (используя и
, этого не происходит при точечном поиске) из другого скрипта, тогда $BackupFile
будет унаследовано от вызывающего, но $script:$BackupFile
будет пустым.
$BackupFile
, но записывать в $script:$BackupFile
. Также остерегайтесь синтаксиса вроде $script:BackupFile += ".bin"
, потому что он считывается из неправильной переменной. Возможный обходной путь, позволяющий избежать ошибок, состоит в том, чтобы начать функцию с $script:BackupFile = $BackupFile
.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
изменение глобальных переменных внутри функции в python
Задавать вопрос
спросил
Изменено 1 год, 3 месяца назад
Просмотрено 27 тысяч раз
Я новичок в Python.
Я не совсем понимаю, как мне нужно устанавливать переменные и изменять их внутри функции, которая будет использоваться позже. Мой сценарий должен получить значения x и y от функции, которые определяются размером диаграммы, создаваемой функцией. Эти переменные необходимо передать команде печати позже в скрипте для вывода html. Допустим, у меня есть глобальные переменные:
исходный_процент = 0,125 исходный_процент = 0,11
Но их нужно будет изменить при запуске функции…
def makeplot(temp, entropy,preq): originx_pct = origin.get_points()[0][0] originy_pct = origin.get_points()[0][1]
Затем печатается в javascript html-страницы, написанной позже…
print('var originx_pct = {};'.format(originx_pct)) print('var originy_pct = {};'.format(originy_pct))
2 переменные не меняются, и я просто не понимаю, что мне нужно сделать, чтобы обновить их и иметь возможность печатать (вне функции). Я предполагаю, что функция не знает о переменных, поэтому не может их изменить.
- python
- переменные
- область видимости
3
В вашей функции необходимо использовать глобальное ключевое слово
.
исходный_процент = 0,125 исходный_процент = 0,11 def makeplot (temp, entropy, preq): глобальный originx_pct, originy_pct originx_pct = origin.get_points()[0][0] originy_pct = origin.get_points()[0][1]
Подробнее о global
можно прочитать здесь.
0
В вашей функции вам нужно вернуть значения. Измените свой makeplot
на следующее:
def makeplot(temp, entropy, preq): local_originx_pct = origin.get_points()[0][0] local_originy_pct = origin.get_points()[0][1] # local_ в именах ничего не значит, это просто для ясности. вернуть local_originx_pct, local_originy_pct
Затем, когда вы вызываете функцию, установите ваши переменные в ее возвращаемое значение.
originx_pct, originy_pct = makeplot(args_and_stuff)
Это считается лучшей практикой, чем прямое изменение глобальных переменных, как в ответе ltd9938. Это помогает предотвратить случайное использование других функций. Дополнительные причины не использовать global
Вы можете либо объявить глобальные переменные в функции с помощью строк global originx_pct
и global originy_pct
, либо вернуть их при запуске функции. Для этого вы можете сделать
по умолчанию makeplot(temp, entropy,preq): возврат (origin.get_points()[0][0],origin.get_points()[0][1])
или
по умолчанию makeplot (temp, entropy, preq): вернуть origin.get_points()[0][0:2]
Если origin.get_points()[0]
имеет только два элемента, вы делаете следующее:
def makeplot(temp, entropy,preq): вернуть origin.