У меня есть модуль и скрипт, который запускает простые пользовательские скрипты. Я хочу, чтобы пользовательский скрипт был максимально простым, поэтому я использую Import-Module с флагом -Global. У меня проблема с переменной "private" модуля. В моем случае у меня есть 2 копии этой переменной. Могу ли я получить только одну копию?
Ниже приведен простой пример. Вы можете запустить, поместив 3 файла в одну папку и выполнив ScriptRunner.ps1.
Модуль.psm1
function Invoke-UserScript
{
param($Path)
$Script:UserScriptFailed = $false
& $Path
return $Script:UserScriptFailed
}
function New-Something
{
$Script:UserScriptFailed = $true
}
function Write-Var
{
Write-Host "Write-Var output: $Script:UserScriptFailed"
}
Export-ModuleMember -Function Invoke-UserScript
Export-ModuleMember -Function New-Something
Export-ModuleMember -Function Write-Var
ScriptRunner.ps1
Set-Location $PSScriptRoot
Import-Module -Name (Resolve-Path '.\Module.psm1') -Global
$failed = Invoke-UserScript -Path '.\UserScript.ps1'
Write-Output "ScriptRunner output: $failed"
Пользовательский скрипт.ps1
New-Something
Write-Var
В моем примере функция New-Something устанавливает UserScriptFailed в $true. Но как только UserScript.ps1 заканчивает работу, ScriptRunner.ps1 видит $false значение.
Выход:
Write-Var output: True
ScriptRunner output: False
@MathiasR.Jessen ScriptRunner.ps1 не является частью модуля и не относится к переменной UserScriptFailed, здесь все в порядке. Проблема в том, что & $Path создает новую копию этой переменной. И эта строка находится внутри модуля.
Возможно, вы могли бы использовать Export-ModuleMember -Variable ..., но я не уверен, как это будет работать с прицелом script:. Другим способом может быть перемещение UserScriptFailed в global-прицел, но это не самая лучшая радость...
Чего вы хотите достичь?
Если вы хотите разделить переменную между несколькими ps1-файлами, вы можете попробовать внедрить переменную в качестве параметра ссылка.
@Moerwald Я хочу проверить пользовательский скрипт с помощью моего модуля. Пользователь создает простой скрипт с командами из моего модуля (я разбираю его скрипт и проверяю, использует ли он только разрешенные команды). Короче говоря, я хочу получить 2 значения True в своем выводе.
Глобальная переменная @Moerwald или экспортированная переменная неверны, так как пользователь может получить к ней доступ
Давайте продолжить обсуждение в чате.





Вы можете попробовать указать исходный код скрипта, который хотите проверить:
function Invoke-UserScript
{
param($Path)
$Script:UserScriptFailed = $false
# Sourcing may add the functions to the current scope
. $Path
& $Path
return $Script:UserScriptFailed
}
Этого следовало ожидать -
$script:относится к области модуля при вызове из экспортируемой функции модуля, аScriptRunner.ps1не является частью модуля.