如何完整获取冗长的字符串环境变量?

How to get a lengthy string environment variable in full?

命令 gci env:ApiSecret | ConvertTo-Json 适用于 一个长字符串,即 Twitter 的 API 秘密,它被截断,没有管道到 JSON。

然而,JSON 相当垃圾。

是否有 "goldilocks" 方法来获取没有无关细节的冗长字符串值?

(不幸的是,gci env: 截断了密钥)

你的陈述并没有剥夺任何东西。但是,出于控制台显示目的,它会截断您在控制台中查看的输出。

如果将结果分配给变量或通过管道分配给文件,则不会截断任何内容。

因此,我对你的问题的假设是,你希望在控制台中查看结果,而不希望控制台截断那里的内容。

为此,您可以自己将结果写入主机。 这是一个简单的例子。

$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}

Result — 如您所见,path 变量值不再被截断。

Get-ChildItem 用于从容器中检索全部或部分项目。请注意,它输出具有 NameValue 属性的对象(将 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 时,它将包含来自 class.

的各种不良属性

简而言之,不要为此使用 ConvertTo-Json。因为你知道你想要的确切项目,直接检索它 using variable syntax...

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

使用 the .NET API 的等效代码是...

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

如果您真的想使用 Get-*Item cmdlet,您只需使用 属性 语法指定它是您想要的 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 值在这里没有用;实际上,这些命令将输出没有截断的整个环境变量。

检查环境变量的最简单方法完整是使用
$env:<varName> () syntax
,在你的情况下意味着:$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