Некоторые переменные инициализируются при входе в систему и не сохраняются вместе с другими записями реестра, поэтому, если вы хотите создать среду, равную исходной среде explorer.exe, вам нужно занести эти элементы в белый список и надеяться, что они не быликем-либо изменено:
@echo off
setlocal ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
goto main
:SetFromReg
FOR /F "tokens=2,*" %%A IN ('REG query "%~1" /v "%~2"^|find /I "REG_"') DO (
call set %~3=%%B
)
goto :EOF
:GetRegEnv
FOR /F %%A IN ('REG query "%~1" /s^|find /I "REG_"') DO (
if /I not "%%~A"=="Path" call :SetFromReg "%~1" "%%~A" "%%~A"
)
goto :EOF
:InheritOrDelete
for %%A in (save_TEMP Path SystemRoot SystemDrive ProgramFiles CommonProgramFiles ALLUSERSPROFILE COMPUTERNAME LOGONSERVER USERNAME USERDOMAIN HOMEDRIVE HOMEPATH USERPROFILE APPDATA) do if /I "%%~A"=="%~1" goto :EOF
set %~1=
goto :EOF
:main
REM Save temp
set save_TEMP=%temp%
if not defined save_TEMP set save_TEMP=%tmp%
for /F "delims==" %%A in ('set') do call :InheritOrDelete "%%~A"
call :GetRegEnv "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
call :GetRegEnv "HKCU\Environment"
REM Special handling for Path
call :SetFromReg "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" Path Path
setlocal
set u=
call :SetFromReg "HKCU\Environment" Path u
endlocal&if not "%Path%"=="" if not "%u%"=="" set Path=%Path%;%u%
REM Restore TEMP/TMP
set TEMP=%save_TEMP%
set save_TEMP=
set TMP=%TEMP%
REM start some command...
start cmd /d /k set
Вывод reg.exe не одинаков для каждой версии Windows, поэтому вам нужно убедиться, что он работает в вашей целевой системе (у него также будут проблемы, если имяпеременной, содержащей пробел, это можно исправить, заменив "tokens=2,*"
на "tokens=2,* delims= "
(вкладка delims equals), но перед этим убедитесь, что вывод reg.exe всегда использует tab в качестве разделителя)
Вы можете обойти эти проблемы, используя сценарий хоста сценариев Windows вместо командного файла:
'orgenvshell.vbs:
Set WShl = CreateObject( "WScript.Shell" )
Set FSO = CreateObject("Scripting.FileSystemObject")
Function CanInherit(n)
CanInherit = False
w = Split("SystemRoot SystemDrive ProgramFiles CommonProgramFiles ALLUSERSPROFILE COMPUTERNAME LOGONSERVER USERNAME USERDOMAIN HOMEDRIVE HOMEPATH USERPROFILE APPDATA")
For Each i In w
If 0 = StrComp(i,n,1) Then
CanInherit = True
Exit Function
End If
Next
End Function
Function GetShortFolderPath(p)
GetShortFolderPath = p
On Error Resume Next
GetShortFolderPath = FSO.GetFolder(p).ShortPath
End Function
Sub E(dst,src)
set envs = WShl.Environment(src)
For Each i In envs
t = Split(i,"=")
n = t(0)
If n = "" Then n = "="&t(1)
If IsNull(dst) Then
If not CanInherit(n) Then envs.Remove n
Else
v = Mid(i,Len(n)+2)
envd = dst
If "X" = dst Then
v = WShl.ExpandEnvironmentStrings(v)
envd = src
If 0 = StrComp(n,"TMP",1) Then v = GetShortFolderPath(v)
If 0 = StrComp(n,"TEMP",1) Then v = GetShortFolderPath(v)
End If
WShl.Environment(envd)(n) = v
End If
Next
End Sub
E Null,"PROCESS"
E "PROCESS","SYSTEM"
E "PROCESS","USER"
E "X","PROCESS"
'Special hack for Path
s = WShl.Environment("SYSTEM")("Path")
u = WShl.Environment("USER")("Path")
If Len(u) Then s = s&";"&u
WShl.Environment("PROCESS")("Path") = WShl.ExpandEnvironmentStrings(s)
'Test a command
WShl.Run "cmd /d /k set ",1
Вероятно, вы можете удалить многие элементы из белого списка, запросив WMI и используя другие методы WSH...