【问题标题】:Environment variables not working properly环境变量无法正常工作
【发布时间】:2021-04-17 20:15:53
【问题描述】:

我正在尝试运行一个应用程序,该应用程序读取一个包含大约 22k 个字符的 JSON 的环境变量。项目设置告诉我使用$(cat ./path/to/file) 正确配置它,但由于我使用的是windows,此命令不起作用。

我尝试使用 GUI 环境变量将文件的内容复制到变量中,但它的输入会将值截断到某个限制,甚至不在文件的一半上。 在此之后,我尝试使用带有命令的 Powershell 设置变量:

$env:myvar = iex '$(type path/to/file)'

然后保存结果:

[System.Environment]::SetEnvironmentVariable('MYVAR', $env:MYVAR, [System.EnvironmentVariableTarget]::Machine)

在这些命令之后,Powershell 能够正确打印结果,但是当我echo它时,CMD 仍然只打印部分值。

这很奇怪,因为 regedit 显示了正确的值 as suggested here

应用程序仍然无法处理该值,因为它不完整。

有什么解决办法吗?

【问题讨论】:

  • “一个 [n] 环境变量,其中包含大约 22k 个字符的 JSON。” 永远不会在 Windows 上工作(env var 值必须适合每个
  • 进程中的总字节数可能是问题所在。但是如果每个 env var 必须小于 ~8k,regedit 如何显示正确的完整值?
  • “读取环境变量的应用程序” - 什么应用程序,它能否以除 (ab) 使用环境变量之外的其他方式读取此数据?
  • 为什么不安装 Wsl(Linux 的 Windows 子系统)并使用 linux 命令
  • @MathiasR.Jessen,这些限制本身并不完全正确 - 请参阅我的答案。

标签: windows powershell environment-variables


【解决方案1】:

注意:此答案适用于Windows

tl;dr

  • 虽然您可以在单个环境变量中存储最多 32,766 个字符,但 cmd.exe 和 PowerShell / .NET 中的标准检索机制(从 v7 开始) .1 / 5.0) 仅支持 4,095

  • PowerShell 中的解决方法是可能的,但最终归结为旨在读取环境变量值的目标可执行文件是否支持读取最大技术长度的值。


  • 单个环境变量中字符数的技术限制为32,76632KB = 32768,减去2)。

    • 从 Windows Server 2008 / Windows Vista 开始,环境块的整体大小不再有限制 - 请参阅the docs
  • 但是,根据环境变量的检索方式,限制可能会更低

    • cmd.exe 和 PowerShell,从 v7.1 / .NET 5.0 开始,最多支持检索 4,095 字符。

    • 但是,在 PowerShell 中,您可以检索更长的值,假设感兴趣的变量是在注册表中永久定义的,并且假设您知道它是在机器级别还是在用户级别定义的;例如,对于 MYVAR 环境变量:

      • 机器级别:

         Get-ItemPropertyValue 'registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' MYVAR 
        
      • 用户级别:

         Get-ItemPropertyValue registry::HKEY_CURRENT_USER\Environment MYVAR
        

【讨论】:

    【解决方案2】:

    试试 type 命令。它相当于 windows 的 unix cat 命令。这意味着将 json 存储在单独的文件中并使用命令“type ”。

    【讨论】:

    • 是的,我知道。我试过这样做,但这不是问题。阅读问题
    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多