#powershell #class #properties #static #powershell-5.0
#powershell #класс #свойства #статический #powershell-5.0
Вопрос:
Почему прямой доступ к статическому элементу завершается неудачей, но косвенный работает? Обратите внимание, что загруженный файл допустим в обоих примерах.
Сбой при использовании прямого доступа к статическому
class OpPrj {
[string] $ProjectPath
static [string] $configFile = 'settings.json';
[OpPrj] static GetSettings(){
return [OpPrj](Get-Content [OpPrj]::configFile | Out-String|ConvertFrom-Json);
}
Работает путем присвоения локальному
class OpPrj {
[string] $ProjectPath
static [string] $configFile = 'settings.json';
[OpPrj] static GetSettings(){
$file = [OpPrj]::configFile
Write-Host $file # outputs settings.json
return [OpPrj](Get-Content $file | Out-String | ConvertFrom-Json);
}
Комментарии:
1. Потому что ваш синтаксис неправильный:
(Get-Content ([OpPrj]::configFile) | ...
Именно так вам нужно ссылаться на статические свойства для любого типа (или перечисления!) при работе с привязкой параметров, то есть заключать в скобки. Я не понимаю, почему анализатор работает здесь таким образом, но это так.2. Разве вы не должны использовать
$this
автоматическую переменную вместо[OpPrj]::configFile
?3. @Theo
$this
не существует для статических членов, потому что они существуют для типа , а не для объекта .4. @TheIncorrigible1 Ах, я этого не знал. Спасибо за предупреждение.
5. @TheIncorrigible1 Разместите это как ответ, и я пометю его как таковой. спасибо!
Ответ №1:
У вас синтаксическая ошибка при вызове Get-Content
:
Get-Content [OpPrj]::configFile
Анализатор PowerShell не может определить, где это заканчивается (я не уверен в причине), поэтому вам нужно явно заключить это в круглые скобки (я также рекомендую указывать параметр, который вы передаете, особенно в сценариях, для удобства чтения):
Get-Content -Path ([OpPrj]::configFile)
Вам нужно будет следовать этому синтаксису для перечислений и статических членов класса.
Во всех (ваш вызов Out-String
не требуется):
class OpPrj
{
[string] $ProjectPath
static [string] $ConfigFile = 'settings.json'
static [OpPrj] GetSettings()
{
return [OpPrj](Get-Content -Path ([OpPrj]::ConfigFile) -Raw | ConvertFrom-Json)
}
}
Комментарии:
1. Мистер Огайо … спасибо вам также за информацию о Out-String . 🙂