[misMetodos] Expandir Variables de Entorno - expandEnvironmentVariables



Me encontrando en C# la necesidad de expandir una variable de entorno (%PUBLIC%) y ha sido recontra facil:

1
2
3
4
public static string ExpandEnviromentVariable(string source)
{
    return Environment.ExpandEnvironmentVariables(source);
}


Tratando de realizar la misma operacion en java no ha resultado tan facil, pero es posible. La estratégia resulta ser la siguiente:

  • Obtener un mapa del sistema con todas las variables de entorno System.getenv(), mi mapa resulto ser asi:
  • {
     LOCALAPPDATA=C:\Users\Desarollo-VII\AppData\Local,
     ChocolateyLastPathUpdate=marjun1911:39:562018,
     PROCESSOR_LEVEL=16,
     FP_NO_HOST_CHECK=NO,
     M2=C:\dev\apache-maven-3.2.1/bin,
     VS140COMNTOOLS=C:\ProgramFiles(x86)\MicrosoftVisualStudio14.0\Common7\Tools\,
     USERDOMAIN=DESARROLLOVI,
     LOGONSERVER=\\DESARROLLOVI,
     JAVA_HOME=C:\ProgramFiles\Java\jdk1.8.0_91,
     SESSIONNAME=Console,
     ALLUSERSPROFILE=C:\ProgramData,
     PROCESSOR_ARCHITECTURE=AMD64,
     PSModulePath=...,
     SystemDrive=C:,
     ANT_HOME=C:\dev\apache-ant-1.9.7,
     DEV_HOME=C:\dev,
     APPDATA=C:\Users\Desarollo-VII\AppData\Roaming,=A:=A:\,
     USERNAME=Desarollo-VII,
     ChocolateyInstall=C:\ProgramData\chocolatey,
     ProgramFiles(x86)=C:\ProgramFiles(x86),
     JBOSS_HOME_=C:\dev\APPsERVER\jboss-4.2.3.GA,
     CommonProgramFiles=C:\ProgramFiles\CommonFiles,
     Path=..., 
     PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC,
     OS=Windows_NT,
     COMPUTERNAME=DESARROLLOVI,
     JBOSS_HOME=C:\dev\APPsERVER\wildfly-10.1.0.Final,
     PROCESSOR_REVISION=0402,
     CommonProgramW6432=C:\ProgramFiles\CommonFiles,
     ComSpec=C:\Windows\system32\cmd.exe,
     ProgramData=C:\ProgramData,
     ProgramW6432=C:\ProgramFiles,
     HOMEPATH=\Users\Desarollo-VII,
     SystemRoot=C:\Windows,
     TEMP=C:\Users\DESARO~1\AppData\Local\Temp,
     HOMEDRIVE=C:,
     PROCESSOR_IDENTIFIER=AMD64Family16Model4Stepping2,
     USERPROFILE=C:\Users\Desarollo-VII,
     TMP=C:\Users\DESARO~1\AppData\Local\Temp,
     M2_HOME=C:\dev\apache-maven-3.2.1,
     CommonProgramFiles(x86)=C:\ProgramFiles(x86)\CommonFiles,
     ProgramFiles=C:\ProgramFiles,
     PUBLIC=C:\Users\Public,
     NUMBER_OF_PROCESSORS=3,
     windir=C:\Windows,
    }
    


  • Crear un Patter para divir la variable en 2 grupos: uno con la expresion completa y el otro sin los porcentajes (Este seria la key del mapa de variabless)
  • 1
    2
    3
    4
    5
    Pattern pattern = Pattern.compile("%(.*?)%");
    Matcher matcher = pattern.matcher(valorInicial);
    
    String grupoCeroPatronEntrePorcentajes = matcher.group(0);
    String grupoUnoPatronSinPorcentaje = matcher.group(1);
    


  • Luego con la key en la mano, se obtiene el valor del mapa
  • Por ultimo se hace un replace del grupo uno(entre porcentaje) con el value del mapa obtenido con el grupo dos





 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public static String expandEnvironmentVariables(String valorInicial) {
    String valorRetorno = null;
    Map<String, String> variablesEntorno = System.getenv();

    Pattern pattern = Pattern.compile("%(.*?)%");
    Matcher matcher = pattern.matcher(valorInicial);

    while (matcher.find()) {
        String grupoCeroPatronEntrePorcentajes = matcher.group(0);

        String grupoUnoPatronSinPorcentaje = matcher.group(1);
        String valorVariableEntorno = variablesEntorno.get(grupoUnoPatronSinPorcentaje);

        valorRetorno = valorInicial.replace(grupoCeroPatronEntrePorcentajes, valorVariableEntorno);
    }

    return valorRetorno;
}


Ejemplo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
System.out.println(expandEnvironmentVariables("%USERPROFILE%\\archivo.txt"));
System.out.println(expandEnvironmentVariables("%APPDATA%\\.minecraft"));
System.out.println(expandEnvironmentVariables("%PUBLIC%\\PepeFolder"));
System.out.println(expandEnvironmentVariables("%WINDIR%\\fonts"));
System.out.println(expandEnvironmentVariables("%JAVA_HOME%\\jre\\bin\\java.exe"));
System.out.println(expandEnvironmentVariables("%JBOSS_HOME%\\bin\\run.bat"));
System.out.println(expandEnvironmentVariables("%M2%"));
System.out.println(expandEnvironmentVariables("%ANT_HOME%"));

/* Outputs:
C:\Users\Desarollo-VII\archivo.txt
C:\Users\Desarollo-VII\AppData\Roaming\.minecraft
C:\Users\Public\PepeFolder
No se encontro la variable : %WINDIR%\fonts
C:\Program Files\Java\jdk1.8.0_91\jre\bin\java.exe
C:\dev\APPsERVER\wildfly-10.1.0.Final\bin\run.bat
C:\dev\apache-maven-3.2.1/bin
C:\dev\apache-ant-1.9.7
*/


Lo unico que habria que validar, es que el mapa no es lo mismo la key PUBLIC o public

No hay comentarios:

Publicar un comentario