Windows 环境变量不能正常工作

Windows 环境变量不能正常工作,windows,powershell,environment-variables,Windows,Powershell,Environment Variables,我正在尝试运行一个应用程序,该应用程序读取一个环境变量,该环境变量包含一个约22k个字符的JSON。项目设置告诉我使用$(cat./path/to/file)来正确配置它,但由于我使用的是windows,这些命令不起作用 我曾尝试使用GUI环境变量将文件内容复制到变量中,但其输入会将值截断到某个限制,该限制甚至不在文件的一半上。 在此之后,我尝试使用Powershell命令设置变量: $env:myvar = iex '$(type path/to/file)' 然后使用以下命令保存结果: [

我正在尝试运行一个应用程序,该应用程序读取一个环境变量,该环境变量包含一个约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能够正确打印结果,但当I
echo
it时,CMD仍然只打印部分值

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

应用程序仍然无法处理该值,因为它尚未完成


是否对此进行了修复?

请尝试键入命令。它是unix cat命令的windows等效命令。这意味着将json存储在一个单独的文件中,并使用命令“type”。

尝试使用type命令。它是unix cat命令的windows等效命令。这意味着将json存储在一个单独的文件中,并使用命令“type”。

注意:这个答案适用于Windows

tl;dr

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

  • PowerShell中的一个解决方案是可行的,但最终要解决的问题是,用于读取环境变量值的目标可执行文件是否支持读取最大技术长度的值


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

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

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

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

      • 在机器层面:

      • 在用户级别:

注意:此答案适用于Windows

tl;dr

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

  • PowerShell中的一个解决方案是可行的,但最终要解决的问题是,用于读取环境变量值的目标可执行文件是否支持读取最大技术长度的值


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

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

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

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

      • 在机器层面:

      • 在用户级别:


“一个包含约22k个字符的JSON的[n]环境变量。”永远不会在Windows上工作(环境变量值必须符合进程中的总字节数可能是问题所在。但如果每个环境变量必须小于~8k,regedit如何显示正确的完整值?“读取环境变量的应用程序”-什么应用程序,除了使用环境变量(ab)外,它还能以其他方式读取此数据吗?为什么不安装Wsl(Windows Subsystem for Linux)并使用Linuxcommands@MathiasR.Jessen,这些限制本身并不完全正确-请参阅我的答案。“一个[n]环境变量,包含一个约22k个字符的JSON。”永远无法在Windows上工作(可能存在问题的是,进程中的总字节数中必须包含环境变量值。但是,如果每个环境变量必须小于~8k,则regedit如何显示正确的完整值?“读取环境变量的应用程序”-什么应用程序,它能否以(ab)以外的其他方式读取此数据使用环境变量?为什么不安装Wsl(Linux的Windows子系统)并使用linuxcommands@MathiasR.Jessen,这些限制本身并不完全正确-请看我的答案。是的,我知道。我试过这样做,但这不是问题。阅读问题是的,我知道。我试过这样做,但这不是问题。阅读问题
 Get-ItemPropertyValue 'registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' MYVAR 
 Get-ItemPropertyValue registry::HKEY_CURRENT_USER\Environment MYVAR