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

时间:2020-01-22 22:09:33

标签: json powershell environment-variables sysadmin

命令gci env:ApiSecret | ConvertTo-Json用于return长字符串,这是Twitter的API秘密,该字符串将被截断而没有使用JSON的管道。

但是,JSON相当垃圾。

是否有一种“金锁”方法来获取冗长的字符串值而没有多余的细节?

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

3 个答案:

答案 0 :(得分:2)

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时,它将包括该类中的各种不良属性。

简而言之,请勿为此使用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值没有用;实际上,这些命令将不截断地输出整个环境变量。

答案 1 :(得分:1)

您的声明不会删除任何内容。但是,出于控制台显示的目的,它会截断您在控制台中查看的输出。

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

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

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

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

结果-如您所见,路径变量值不再被截断。

enter image description here

答案 2 :(得分:1)

完整检查环境变量 的最简单方法是使用
$env:<varName>({{3} })语法
,在您的情况下,其含义是:$env:ApiSecret(如果变量名包含特殊字符,请在$中将{...}后面的所有内容括起来;例如{{1} })

这样,环境变量的值(总是 strings )长于终端(控制台)的宽度,只需在随后的行上继续。

演示:

${env:ApiSecret(1)}

80个字符。宽终端,您将看到如下输出:

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

# Output the long value
$env:ApiSecret

如果您确实想使用xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx! (或Get-Item,在这种情况下的作用相同),则有两种选择:

Get-ChildItem