Leo*_*mos 1 windows powershell environment-variables
我正在尝试运行一个应用程序来读取包含大约 22k 个字符的 JSON 的环境变量。项目设置告诉我使用$(cat ./path/to/file)正确配置它,但由于我使用的是 Windows,此命令不起作用。
我尝试使用 GUI 环境变量将文件的内容复制到变量,但其输入将值截断到某个限制,该限制甚至不在文件的一半上。之后,我尝试使用 Powershell 和以下命令设置变量:
$env:myvar = iex '$(type path/to/file)'
Run Code Online (Sandbox Code Playgroud)
然后保存结果:
[System.Environment]::SetEnvironmentVariable('MYVAR', $env:MYVAR, [System.EnvironmentVariableTarget]::Machine)
Run Code Online (Sandbox Code Playgroud)
在这些命令之后,Powershell 能够正确打印结果,但 CMD 仍然只打印部分值echo。
这很奇怪,因为注册表显示了此处建议的正确值。
应用程序仍然无法处理该值,因为它不完整。
有什么解决办法吗?
注意:此答案适用于Windows。
太长了;博士
虽然您可以在单个环境变量中存储最多字符,但 PowerShell / .NET(从 v7.1 / 5.0 开始)中的标准检索机制最多仅支持.32,766cmd.exe4,095
PowerShell 中的解决方法是可能的,但最终取决于用于读取环境变量值的目标可执行文件是否支持读取技术最大长度的值。
单个环境变量中字符数的技术限制是32,766(= 32KB、32768minus 2)。
但是,根据环境变量的检索方式,限制可能会更低:
cmd.exe从 v7.1 / .NET 5.0 开始,两者和 PowerShell 都支持检索最多4,095字符。
但是,在 PowerShell 中,您可以检索更长的值,假设感兴趣的变量在注册表中持久定义,并假设您知道它是在计算机级别还是用户级别定义的;例如,对于MYVAR环境变量:
在机器层面:
Get-ItemPropertyValue 'registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' MYVAR
Run Code Online (Sandbox Code Playgroud)
在用户层面:
Get-ItemPropertyValue registry::HKEY_CURRENT_USER\Environment MYVAR
Run Code Online (Sandbox Code Playgroud)