Как получить длинную строковую переменную среды в полном объеме? - PullRequest
1 голос
/ 23 января 2020

Команда gci env:ApiSecret | ConvertTo-Json работает на , возвращает длинную строку, секрет API для Twitter, который усекается без канала до JSON.

Однако JSON довольно спам.

Есть ли способ "золотых замков" для получения длинных строковых значений без посторонних деталей?

(К сожалению, gci env: усекает ключ)

Ответы [ 3 ]

2 голосов
/ 23 января 2020

Get-ChildItem - для извлечения всех или поднабора элементов из контейнера. Обратите внимание, что он выводит объект со свойствами Name и Value (подставляя Path в качестве другого длинного значения переменной среды) ...

PS> gci env:Path

Name                           Value
----                           -----
Path                           C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\WINDO...

Get-Item дает тот же результат ...

PS> gi env:Path

Name                           Value
----                           -----
Path                           C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\WINDO...

В любом случае, получаемый объект является DictionaryEntry ...

PS> gi env:Path | Get-Member


   TypeName: System.Collections.DictionaryEntry

Name          MemberType    Definition
----          ----------    ----------
Name          AliasProperty Name = Key
Equals        Method        bool Equals(System.Object obj)
GetHashCode   Method        int GetHashCode()
GetType       Method        type GetType()
ToString      Method        string ToString()
PSDrive       NoteProperty  PSDriveInfo PSDrive=Env
PSIsContainer NoteProperty  bool PSIsContainer=False
PSPath        NoteProperty  string PSPath=Microsoft.PowerShell.Core\Environment::path
PSProvider    NoteProperty  ProviderInfo PSProvider=Microsoft.PowerShell.Core\Environment
Key           Property      System.Object Key {get;set;}
Value         Property      System.Object Value {get;set;}

... и когда вы передадите его на ConvertTo-Json, он будет включать в себя все виды нежелательных свойства этого класса.

Короче, не используйте ConvertTo-Json для этого. Поскольку вы точно знаете нужный элемент, просто извлеките его напрямую , используя переменный синтаксис ...

PS> $env:Path
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;...

Эквивалентный код с использованием . NET API будет be ...

PS> [Environment]::GetEnvironmentVariable('Path')
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;...

Если вы действительно хотите использовать командлет Get-*Item, вам просто нужно указать, что это свойство Value, которое вы хотите использовать с помощью синтаксиса свойства ...

PS> (gi env:Path).Value
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;...

... или Select-Object ...

PS> gi env:Path | Select-Object -ExpandProperty 'Value'
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;...

Все вышеперечисленные команды будут выводить только [String], содержащий все значения этой переменной среды. Я вставил конечные эллипсы, так как показывать мое полное значение Path здесь бесполезно; на практике эти команды будут выводить всю переменную среды без усечения.

1 голос
/ 23 января 2020

Самый простой способ проверить значение переменных среды полностью - это использовать
$env:<varName> ( нотация переменных пространства имен ) синтаксис
, который в вашем случае означает: $env:ApiSecret (если имя переменной содержит специальные символы, заключите все после $ в {...}; например, ${env:ApiSecret(1)})

Таким образом значения переменных среды (которые неизменно строки ) длиннее ширины вашего терминала (консоли) просто продолжаются в последующих строках.

Для демонстрации:

# Simulate a long value (200 chars.)
$env:ApiSecret = 'x' * 199 + '!'

# Output the long value
$env:ApiSecret

С 80-чар. широкий терминал, вы увидите следующее:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx!

Если вы действительно хотите использовать Get-Item (или Get-ChildItem, который действует так же в этом дело), ​​у вас есть два варианта:

# Format-List shows each property on its own line, 
# with values wrapping across multiple lines
Get-Item env:ApiSecret | Format-List

# Format-Table -Wrap causes values to wrap as well.
Get-Item env:ApiSecret | Format-Table -Wrap
1 голос
/ 23 января 2020

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

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

Поэтому Я предполагаю, что вы хотите просмотреть результат в консоли, а консоль не усекает ваши данные.

Для этого вы можете сами написать результаты хосту. Вот простой пример, который делает именно это.

$envvars = gci env: 
$Max = ($envvars.name| Measure-Object -Property length -Maximum).Maximum + 3
$envvars | % {Write-Host $_.name.padright($Max,' ')  -ForegroundColor Cyan -NoNewline;Write-Host $_.value}

Результат - Как видите, значение переменной path больше не усекается.

enter image description here

...