Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Cleaning %PATH% with WinBatch

by LanX (Sage)
on May 22, 2022 at 16:36 UTC ( #11144086=perlquestion: print w/replies, xml ) Need Help??

LanX has asked for the wisdom of the Perl Monks concerning the following question:

Hi

NB: Not off-topic!

I'm trying to build a one-click solution to switch between various Perl versions on Win for my colleagues.

Using portableshell.bat from strawberries portable versions works very good so far.

It will basically add the needed PATHs in %PATH%

C:\perls\strawberry-perl-5.32.1.1-64bit-portable\perl\site\bin;C:\perls\strawberry-perl-5.32.1.1-64bit-portable\perl\\bin;C:\perls\strawberry-perl-5.32.1.1-64bit-portable\c\bin;C:\Windows\system32;... etc

To make this even more idiot proof (talking about me not my colleagues ;) I'd like to purge all older entries from PATH C:\perls\*;

My BAT-Shell knowhow is limited, I was only able to find a weak solution by replacing C:\perls\ with a dummy DISABLED to "sabotage" those entries, but it'll keep ugly artifacts in the PATH. (I doubt this will insert much of a performance penalty)

So is there a good way to delete those older entries?

(off course I could spawn a perl one-liner, but the basic idea of BAT is to keep the delay minimal)

Thanks

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

PS: Yes I know about berrybrew, and I will look into it. But for the time being we need to extend this solution to support ActiveState too.

Replies are listed 'Best First'.
Re: Cleaning %PATH% with WinBatch
by pryrt (Monsignor) 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?

      > 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)

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

      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...

Re: Cleaning %PATH% with WinBatch
by swl (Vicar) 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.

      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?)

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

      °) 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.

Re: Cleaning %PATH% with WinBatch
by Discipulus (Abbot) 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.
      > 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...

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

        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.
        Funny conclusion. None "set perllib". Only issue would be ftype/assoc clobbering and Pl2bat still like an idiot still relies on %path%
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.

      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.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

        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.

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
      > build a path.

      someone else could have added his own path in the meantime.

      There is no other way to tell what the real path is supposed to be.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

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%

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11144086]
Approved by erzuuli
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (2)
As of 2022-06-26 17:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My most frequent journeys are powered by:









    Results (86 votes). Check out past polls.

    Notices?