From abd389acb3d991ae9849a8d44deb6f3cd55ed52f Mon Sep 17 00:00:00 2001 From: Cory Knox Date: Thu, 30 Jun 2022 15:30:33 -0700 Subject: [PATCH] (#1392) Update refreshenv to detect when not cmd Detect when the calling shell is not cmd.exe and issue a message that it does not work on that shell. --- .../redirects/RefreshEnv.cmd | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/chocolatey.resources/redirects/RefreshEnv.cmd b/src/chocolatey.resources/redirects/RefreshEnv.cmd index 88161f61af..c42cf90657 100644 --- a/src/chocolatey.resources/redirects/RefreshEnv.cmd +++ b/src/chocolatey.resources/redirects/RefreshEnv.cmd @@ -1,3 +1,66 @@ +:: Code generously provided by @beatcracker: https://github.com/beatcracker/detect-batch-subshell +@echo off + +setlocal EnableDelayedExpansion + +:: Dequote path to command processor and this script path +set ScriptPath=%~0 +set CmdPath=%COMSPEC:"=% + +:: Get command processor filename and filename with extension +for %%c in (!CmdPath!) do ( + set CmdExeName=%%~nxc + set CmdName=%%~nc +) + +:: Get this process' PID +:: Adapted from: http://www.dostips.com/forum/viewtopic.php?p=22675#p22675 +set "uid=" +for /l %%i in (1 1 128) do ( + set /a "bit=!random!&1" + set "uid=!uid!!bit!" +) + +for /f "tokens=2 delims==" %%i in ( + 'wmic Process WHERE "Name='!CmdExeName!' AND CommandLine LIKE '%%!uid!%%'" GET ParentProcessID /value' +) do ( + rem Get commandline of parent + for /f "tokens=1,2,*" %%j in ( + 'wmic Process WHERE "Handle='%%i'" GET CommandLine /value' + ) do ( + + rem Strip extra CR's from wmic output + rem http://www.dostips.com/forum/viewtopic.php?t=4266 + for /f "delims=" %%x in ("%%l") do ( + rem Dequote path to batch file, if any (3rd argument) + set ParentScriptPath=%%x + set ParentScriptPath=!ParentScriptPath:"=! + ) + + rem Get parent process path + for /f "tokens=2 delims==" %%y in ("%%j") do ( + rem Dequote parent path + set ParentPath=%%y + set ParentPath=!ParentPath:"=! + + rem Handle different invocations: C:\Windows\system32\cmd.exe , cmd.exe , cmd + for %%p in (!CmdPath! !CmdExeName! !CmdName!) do ( + if !ParentPath!==%%p set IsCmdParent=1 + ) + + rem Check if we're running in cmd.exe with /c switch and this script path as argument + if !IsCmdParent!==1 if %%k==/c if "!ParentScriptPath!"=="%ScriptPath%" set IsExternal=1 + ) + ) +) + +if !IsExternal!==1 ( + echo %~nx0 does not work when run from this process. If you're in PowerShell, please 'Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1' and try again. + exit 1 +) + +endlocal +:: End code from @beatcracker @echo off :: :: RefreshEnv.cmd