Re: Cleaning %PATH% with WinBatch
by pryrt (Abbot) on May 22, 2022 at 16:56 UTC
|
Modern berrybrew handles ActiveState as well.
And if you can replace text in the path with DISABLED, why can't you replace it with empty, or at least a single semicolon? | [reply] |
|
> Modern berrybrew handles ActiveState as well.
ah good to know °
> And if you can replace text in the path with DISABLED, why can't you replace it with empty, or at least a single semicolon?
I can only replace a fixed leading part not the whole entry because there doesn't seem to be a wildcard mechanism like regex s/c:\\perls\\.*?;//g ... I can only s/c:\\perls\\/DISABLED/g
(Well I could if I iterated over all possible complete entries)
update
demo:
c:\tmp>set DEMO=C:\perls\strawberry-perl-5.32.1.1-64bit-portable\perl\
+site\bin;
c:\tmp>set DEMO=%DEMO:C:\perls\=DISABLED%
c:\tmp>echo %DEMO%
DISABLEDstrawberry-perl-5.32.1.1-64bit-portable\perl\site\bin;
update
°) though can't find it mentioned on GitHub... | [reply] [d/l] [select] |
Re: Cleaning %PATH% with WinBatch
by swl (Parson) on May 22, 2022 at 22:24 UTC
|
I don't think this addresses your issue but seems generally relevant and maybe useful to know.
Substrings can be removed using the idiom below.
set PATH=%PATH:C:\perls\strawberry-perl-5.32.1.1-64bit-portable\perl\b
+in;=%
A looped example and some gotchas are in this SO post. | [reply] [d/l] |
|
Thanks, I knew that construct and that SO thread already.
Actually that's exactly how I inserted the "DISABLED" part, see demo here.
Problem is that, like already explained, I would need to know all possible entries beforehand instead of being able to exclude anything following C:\perls\...
I also looked into batch solutions to split on ; and loop over it. But that's not trivial because, believe it or not, a ";" could be part of a filename° and appending to a variable in a loop is not trivial in WinB*tch language... 🤦
In short: batch is really a horrible language for a perverted file-system invented by a distorted sadist. ˛
I'm thinking now it's a good bargain between mental sanity, maintainability and performance to use a Perl one-liner returning the cleaned path. But only called for that edge case, i.e. if batch detects C:\perls in the path.
(I could also use PowerShell, but why adding one more technology at that place?)
°) tho, I could ignore this problem as long as the paths of my Perl installations are clean, which goes without saying.
˛) I have to apologize that was too harsh.
It's rather a mix of the worst parts of bash and zsh, with the source google translated to Chinese and back to English but via Khoisan, while purging all documentation during compilation with random settings.
| [reply] [d/l] [select] |
Re: Cleaning %PATH% with WinBatch
by Discipulus (Canon) on May 23, 2022 at 07:30 UTC
|
Hello LanX,
> To make this even more idiot proof .. I'd like to purge all older entries from PATH
I dont see the point: if you prepend your desired perl to PATH (as portableshell.bat does) there is almost no risk of collision: only a call to a make flavour not present in the first distribution can lead to problems. I mean: if you cast perl5.34 and this does not contains nmake (just as example) but this executable is present in perl5.10 just few entry onward in PATH ..so this can be a problem. It seems to me a very advanced usage so probably not your (collegues) case.
If you are already using portableshell.bat you can simply hardcode your desired PATH modifying the line..
set PATH=%~dp0perl\site\bin;%~dp0perl\bin;%~dp0c\bin;%PATH%
# ...to something like
set PATH=%~dp0perl\site\bin;%~dp0perl\bin;%~dp0c\bin;c:\Windows;C:
+\Windows\System32;
The above is generally enough.
In more customized scenarios you can reuse other ENV entries to build up your final PATH for example:
HOMEDRIVE=C:
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
windir=C:\WINDOWS
PS more on this:
> off course I could spawn a perl one-liner, but the basic idea of BAT is to keep the delay minimal
Perl is already here and used, so if you prefere perl over batch (;) you can use it to change $ENV{PATH} you only need to modify the perl oneliner aimed to print nice stuff on screen:
# line 24 of portableshell.bat
perl -MConfig -e "printf("""Perl executable: %%s\nPerl version : %%v
+d / $Config{archname}\n\n""", $^X, $^V)" 2>nul
I hope File::Spec can handle weird windows names correctly using path separtor and the idiom @PATH = File::Spec->path();
L*
There are no rules, there are no thumbs..
Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
| [reply] [d/l] [select] |
|
> I dont see the point: if you prepend your desired perl to PATH (as portableshell.bat does) there is almost no risk of collision: only a call to a make flavour not present in the first distribution can lead to problems.
I disagree, I had a case where AS and SB where both installed via MSI and the installations confused each other.
- perldoc was confused
- cpanm had mysterious fails
I haven't tested yet but I suppose two portable SBs in the path will lead to the primary searching for modules in the secondary (there is no PERL5LIB (possible typo?) setting, they are dynamically derived from the path)
I prefer operation with a clean slate...
| [reply] |
|
Hello again LanX,
> I suppose two portable SBs in the path will lead to the primary searching for modules in the secondary
It is very disappointing but you are right (not for you, for the fact itself ;)
perl -v
This is perl 5, version 26, subversion 0 (v5.26.0) built for MSWin32-x
+64-multi-thread
# this perl has MCE support
perl -MMCE -e 1
# and this is its path
PATH=C:\EX_D\ulisseDUE\perl5.26.64bit\perl\site\bin;
C:\EX_D\ulisseDUE\perl5.26.64bit\perl\bin;
C:\EX_D\ulisseDUE\perl5.26.64bit\c\bin;
C:\EX_D\ulisseDUE\bin\UnxUtils\usr\local\wbin;
C:\WINDOWS;
C:\WINDOWS\system32;
# this other one is 5.20.3 WITHOUT MCE
perl -v
This is perl 5, version 20, subversion 3 (v5.20.3) built for MSWin32-x
+64-multi-thread
# original path
PATH=C:\EX_D\ulisseDUE\perl5.20.64bit\perl\site\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\perl\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\c\bin;
C:\EX_D\ulisseDUE\bin\UnxUtils\usr\local\wbin;
C:\WINDOWS;C:\WINDOWS\system32;
perl -MMCE -e 1
Can't locate MCE.pm in @INC (you may need to install the MCE module)
(@INC contains: C:/EX_D/ulisseDUE/perl5.20.64bit/perl/site/lib C:/EX_D
+/ulisseDUE/perl5.20.64bit/perl/vendor/lib C:/EX_D/ulisseDUE/perl5.20.
+64bit/perl/lib .).
BEGIN failed--compilation aborted.
# prepending the other version in PATH
set PATH=C:\EX_D\ulisseDUE\perl5.26.64bit\perl\site\bin;
C:\EX_D\ulisseDUE\perl5.26.64bit\perl\bin;
C:\EX_D\ulisseDUE\perl5.26.64bit\c\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\perl\site\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\perl\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\c\bin;
C:\EX_D\ulisseDUE\bin\UnxUtils\usr\local\wbin;
C:\WINDOWS;
C:\WINDOWS\system32;
path
PATH=C:\EX_D\ulisseDUE\perl5.26.64bit\perl\site\bin;
C:\EX_D\ulisseDUE\perl5.26.64bit\perl\bin;
C:\EX_D\ulisseDUE\perl5.26.64bit\c\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\perl\site\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\perl\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\c\bin;
C:\EX_D\ulisseDUE\bin\UnxUtils\usr\local\wbin;
C:\WINDOWS;
C:\WINDOWS\system32;
# now... omg UPDATE: wrong assumption from my part: see below Anonymou
+s Monk at 11144117
perl -MMCE -e "print $INC{'MCE.pm'}"
C:/EX_D/ulisseDUE/perl5.26.64bit/perl/site/lib/MCE.pm
The wonderful cpanm program is problematic on windows: Re: Should cpanminus be part of the standard Perl release? -- MSWin32
I'd hardcode PATH inside the portableshell.bat
PS
if the alien perl is appended to PATH the beahviour is sane
set PATH=C:\EX_D\ulisseDUE\perl5.20.64bit\perl\site\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\perl\bin;
C:\EX_D\ulisseDUE\perl5.20.64bit\c\bin;
C:\EX_D\ulisseDUE\bin\UnxUtils\usr\local\wbin;
C:\WINDOWS;C:\WINDOWS\system32;
C:\EX_D\ulisseDUE\perl5.26.64bit\perl\site\bin;
C:\EX_D\ulisseDUE\perl5.26.64bit\perl\bin;
C:\EX_D\ulisseDUE\perl5.26.64bit\c\bin;
perl -MMCE -e "print $INC{'MCE.pm'}; print @INC"
Can't locate MCE.pm in @INC (you may need to install the MCE module) (
+@INC contains: C:/EX_D/ulisseDUE/perl5.20.64bit/perl/site/lib C:/EX_D
+/ulisseDUE/perl5.20.64bit/perl/vendor/lib C:/EX_D/ulisseDUE/perl5.20.
+64bit/perl/lib .).
BEGIN failed--compilation aborted.
which perldoc.bat
C:\EX_D\ulisseDUE\perl5.20.64bit\perl\bin\perldoc.bat
L*
There are no rules, there are no thumbs..
Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
| [reply] [d/l] [select] |
|
|
|
|
Funny conclusion. None "set perllib". Only issue would be ftype/assoc clobbering and Pl2bat still like an idiot still relies on %path%
| [reply] |
|
Re: Cleaning %PATH% with WinBatch
by stevieb (Canon) on May 23, 2022 at 14:45 UTC
|
berrybrew has a full blown UI that resides in the task bar that allows you to easily switch the perl you're using (it also allows installation, removal etc, but I digress).
The path stuff can be a nightmare. It took me a long time to sort it out and get it right.
| [reply] |
|
Thanks Steve,
my colleague is already at it and I'll personally certainly test it out.
Though otherwise stated in I couldn't find any mention of AS in Berrybrew's docs.
We have a infrastructure with AS and plan to migrate to SB.
But the fact that SB is still at 5.32 makes it necessary to plan for a future plan B return to AS ("Server edition") or even Linux.
That's why I'm first looking at that minimalist but robust solution.
| [reply] |
|
You can add external perls through the virtual command. I don't recall if 'virtual' made it into the GUI; I'm pretty sure it's a CLI-only feature.
After added, you can switch to, or use it just like any Strawberry Perl already managed by berrybrew.
For example, berrybrew virtual activestate, then follow the prompts.
| [reply] [d/l] |
Re: Cleaning %PATH% with WinBatch
by Anonymous Monk on May 23, 2022 at 00:31 UTC
|
Don't clean build a path. See all from This.bat. Self modifying batch file perl program that sets path | [reply] |
|
| [reply] |
|
| [reply] |
|
|
|
|
Re: Cleaning %PATH% with WinBatch
by Anonymous Monk on Jun 08, 2022 at 01:53 UTC
|
You also can use a script like this to delete all entries inluding c:\perls from path:
@echo off
setlocal EnableDelayedExpansion
::set path
echo PATH OLD %PATH:;=&echo.%
set $line=%path%
set $line=%$line: =#%
set $line=%$line:;= %
set $line=%$line:)=^^)%
echo FOUND
for %%a in (%$line%) do @echo %%a | find /i "C:\perls" || set $newpath
+=!$newpath!;%%a
echo.
set $newpath=!$newpath:#= !
set $newpath=!$newpath:^^=!
set path=!$newpath:~1!
echo PATH NEW %PATH:;=&echo.%
However, it's a little bit tricky to set the environment permanently. You would have to use 'setx' instead of set or include this last line:
endlocal & set path=%$newpath:~1%
| [reply] [d/l] [select] |