如何完整获取冗长的字符串环境变量?
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
用于从容器中检索全部或部分项目。请注意,它输出具有 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
时,它将包含来自 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
命令 gci env:ApiSecret | ConvertTo-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
用于从容器中检索全部或部分项目。请注意,它输出具有 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
时,它将包含来自 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>
($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