Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re^2: [implementation specific to windows] writing a proper batch file for terminal start-up

by Aldebaran (Chaplain)
on Oct 19, 2019 at 04:35 UTC ( #11107682=note: print w/replies, xml ) Need Help??


in reply to Re: [implementation specific to windows] writing a proper batch file for terminal start-up
in thread [implementation specific to windows] writing a proper batch file for terminal start-up

When I double-click on a PL file, I associated it with RUN.BAT, so when I click to open, it runs and the terminal window stays open until I press enter.

I have been reseaching and puzzling on this response and thank you for it. Right now, when I click on a .pl, a dos terminal with strawberry perl exe on the top appears, executes the program and then disappears before I can lay eyes on it. This would be a great time to change this. In this script:

@ECHO OFF C:\BIN\PERL\TINYPERL -I C:\BIN\PERL\LIB "%1" %2 %3 ECHO. PAUSE

, what are to be %2 %3 ?

I have been trying to replicate what I see here and at this link another link, but I seem to have come up short in a command prompt in administrator mode:

PS C:\Strawberry> Ftype Perl_program_file="C:\Strawberry\perl\bin\perl +.exe" %1 Ftype : The term 'Ftype' is not recognized as the name of a cmdlet, fu +nction, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the p +ath is correct and try again. At line:1 char:1 + Ftype Perl_program_file="C:\Strawberry\perl\bin\perl.exe" %1 + ~~~~~ + CategoryInfo : ObjectNotFound: (Ftype:String) [], Comma +ndNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PS C:\Strawberry>

The assoc command works here:

C:\Users\tblaz>assoc .pl .pl=Perl_program_file C:\Users\tblaz>

When I try to fold this into a useful batch file, Perl_program_file doesn't seem to do anything yet:

@echo off rem set env variables set TERM=dumb set PERL_JSON_BACKEND=JSON::XS set PERL_YAML_BACKEND=YAML rem avoid collisions with other perl stuff on your system rem set PERL5LIB= set PERL5OPT= set PERL_MM_OPT= set PERL_MB_OPT= perl -e "printf("""Perl executable: %%s\nPerl version : %%vd\n""", $ +^X, $^V)" 2>nul if ERRORLEVEL==1 echo.&echo FATAL ERROR: 'perl' does not work; check i +f your strawberry pack is complete! Ftype Perl_program_file="C:\Strawberry\perl\bin\perl.exe" %1 ECHO. PAUSE

When I double click on the .bat file that this is I get:

Perl executable: C:\Strawberry\perl\bin\perl.exe Perl version : 5.30.0 File type 'Perl_program_file' not found or no open command associated +with it. Press any key to continue . . .

At least I can read the output, but I'm not getting this yet. Do I need to create a .reg file to reassociate .pl?

  • Comment on Re^2: [implementation specific to windows] writing a proper batch file for terminal start-up
  • Select or Download Code

Replies are listed 'Best First'.
Re^3: [implementation specific to windows] writing a proper batch file for terminal start-up
by marto (Archbishop) on Oct 19, 2019 at 08:44 UTC

    "I seem to have come up short in a command prompt in administrator mode:"

    The examples you link to instruct you to open a command prompt, you have executed this in a power shell session, not a command prompt. I find it simpler, more productive and more portable just to open up a a command prompt and run the programs from there, after the initial setup. If you are using a fancy IDE it may already have such functionality available.

    Update: typo excited/executed, autocorrect...

      The examples you link to instruct you to open a command prompt, you have [executed] this in a power shell session, not a command prompt.

      I repeated and found the command prompt that opened as admin. The commands accepted the syntax, but it did not seem to change the behavior of windows when a .pl file was thereafter double-clicked on. In settings, I changed the default app to open to be notepad++, which is probably the best outcome anyways. They don't want to let you open files with programs that you have rolled yourself but that it fit into the app world. I felt very uncomfortable in both the power shell and the admin shell. If it's not a one and done, then I don't want to do it again.

      I find it simpler, more productive and more portable just to open up a a command prompt and run the programs from there, after the initial setup.

      Indeed, what I *really, really* miss is the ability in ubuntu to right click and "open terminal here." Right now, I *can* get a terminal to open on right-click, but it's the bash terminal from Git, and it's a whole different animal than a dos terminal. I really feel like I crawl around with dos. It's one of the reasons that I find myself always returning to 'nix systems. I heard about a Raspberry Pi at a social event this weekend and can't wait to get one.

      I would like to thank everyone for taking the time to address these implementation-specific issues. Speaking only for me, I wouldn't understand anything about contemporary Windows without perl. Here is my latest startup script,

      C:\Users\tblaz\Documents\evelyn>type 3.startup.bat @echo off rem set env variables set TERM=dumb set PERL_JSON_BACKEND=JSON::XS set PERL_YAML_BACKEND=YAML rem avoid collisions with other perl stuff on your system rem set PERL5LIB= set PERL5OPT= set PERL_MM_OPT= set PERL_MB_OPT= perl -e "printf("""Perl executable: %%s\nPerl version : %%vd\n""", $ +^X, $^V)" 2>nul if ERRORLEVEL==1 echo.&echo FATAL ERROR: 'perl' does not work; check i +f your strawberry pack is complete! rem a couple things that didn't quite work...privileges a problem rem assoc .pl=PerlScript rem ftype PerlScript=C:\Strawberry\perl\bin\perl.exe "%1" %* cd C:\Users\tblaz\Documents\evelyn\ perl 8.monktag.pl C:\Users\tblaz\Documents\evelyn>

      This is probably good enough for now.

        Windows right-click (tangent):

        what I *really, really* miss is the ability in ubuntu to right click and "open terminal here."

        open command window here should help you get the equivalent enabled in Windows. I additionally create an "Open this File's Directory" to the RClick menu for every file type by doing the following from a .reg file:

        Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Classes\*\shell\OpenThisFilesDirectory] @="Open This File's Directory" "Icon"="%SystemRoot%\\system32\\cmd.exe" [HKEY_CURRENT_USER\Software\Classes\*\shell\OpenThisFilesDirectory\com +mand] @="cmd.exe /s /k pushd \"%W\""

        Running that reg file builds the following key/value/data set:

        HKCU\Software\Classes\*\shell\OpenThisFilesDirectory (Default) [REG_SZ] = Open This File's Directory Icon [REG_SZ] = %SystemRoot%\system32\cmd.exe HKCU\Software\Classes\*\shell\OpenThisFilesDirectory\command (Default) [REG_SZ] = cmd.exe /s /k pushd "%W"

        (edit: s/\Q[tangent]\E/(tangent)/)

Re^3: [implementation specific to windows] writing a proper batch file for terminal start-up
by harangzsolt33 (Pilgrim) on Oct 19, 2019 at 06:17 UTC
    "Right now, when I click on a .pl, a dos terminal with strawberry perl exe on the top appears, executes the program and then disappears before I can lay eyes on it."

    Yes, see, that's why I associated the .pl files with a bat file. Here's how to do it:

    * On Windows XP, you would right-click on any .pl file, and go to "Open With..." and click on "Choose Program..." and then "Browse." Then find the bat file and put a checkmark next to "Always use the selected program to open this kind of file" and click on OK.

    * On Windows 7, right-click on any .pl file, and go to "Open With..." and click on "Choose default program..." Then click on "Browse" and find the bat file and put a checkmark next to "Always use the selected program to open this kind of file" and click OK.

    * On Windows 10, you have to right-click on any .pl file, and click on "Open With" and then "Choose another app" and then in the new window click "More Apps" and then scroll down and click on "Look for anther app on this PC." and then find that bat file, and put a checkmark next to "Always use this app to open .pl files." and click on OK.

    The REG file changes the icon that appears next to .pl files. You can ignore that. That just changes the look and feel. If you do decide to use a custom icon for pl files, you have to get the icon file first, then edit the reg file. Make sure the paths are correct. Double-click on the reg file... and then associate the pl file with the bat file. That should be the last thing.

    But you have to have the bat file ready first. I would just call it run.bat to make it short, and in your case it may look like this:

    @ECHO OFF set TERM= set PERL_JSON_BACKEND= set PERL_YAML_BACKEND= set PERL5LIB= set PERL5OPT= set PERL_MM_OPT= set PERL_MB_OPT= C:\Strawberry\perl\bin\perl.exe -I C:\Strawberry\Perl\lib "%1" %2 %3 ECHO. PAUSE

    Explanation: I am not sure why you have to set all those various environmental variables in the beginning, but I am assuming that they are necessary for something. So, we clear those values first. Then we call C:\Strawberry\perl\bin\perl.exe by giving its exact location. If you say you want to run the perl.exe which is located in the folder "C:\Strawberry\perl\bin" then you can be sure that that's the version of perl that will run! Especially if you also specify the location of the lib folder, you'll definitely get that perl running, and not something else. The %1 and %2 and %3 in the command line are the arguments. The first argument is the file name which is going to be %1. And then if you pass two more arguments to your perl program, then those would be %2 and %3. You could add %4 and %5 %6 %7 %8 %9 to make a full list.

    So, let's say you're in command prompt, and you enter:

    C:\Strawberry\perl>run.bat example.pl Hello World

    In this case, your run.bat program runs the perl program and passes two arguments "Hello" and "World" so "Hello" becomes %2 and "World" becomes %3. Your perl program will receive those arguments. On the other hand, if you omit %2 %3 %4 etc... then your perl program won't receive any arguments even if you do try to pass some arguments.

    The bat file is a pretty simple program. You could try and omit all those lines that start with "set" and see what happens. I think, those are totally unnecessary, but I could be wrong.

    You could insert these two lines however:

    SET PATH=C:\Strawberry\perl\site\bin;%PATH%
    SET PATH=C:\Strawberry\perl\bin;%PATH%

    These two lines add the strawberry bin folder to the path, so if perl or your program calls any executable that may be located in Strawberry/perl/bin, then those programs get executed.

    Your path may already contain some references to other perl versions on your computer, so you could simply change the PATH instead of adding to it:

    SET PATH=C:\WINDOWS;WINDOWS\SYSTEM32;C:\Strawberry\Perl\bin;

    That's all you have to do, and it should work.

    Okay. I am not sure what this is what you wrote:

    "C:\Strawberry> Ftype Perl_program_file="C:\Strawberry\perl\bin\perl +.exe" %1 Ftype : The term 'Ftype' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:1 + Ftype Perl_program_file="C:\Strawberry\perl\bin\perl.exe" %1"

    If you're in the terminal window staring at command prompt, then you would run a perl script by entering the following command:

    C:\Users\tblaz\Desktop>C:\Strawberry\perl\run example.pl

    OR you could just enter:

    C:\Users\tblaz\Desktop>run example.pl

    This will work if you have added "C:\Strawberry\perl" to your system PATH. If you haven't yet, then go to Control Panel >> System >> Advanced >> Environment Variables. and find the Path string and update it by adding "C:\Strawberry\perl" to the end of the long string. Separate each path with a semi-colon ; So, your path string will probably look something like this :

    Path=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Strawberry\Perl;

      * On Windows 10, you have to right-click on any .pl file, and click on "Open With" and then "Choose another app" and then in the new window click "More Apps" and then scroll down and click on "Look for anther app on this PC." and then find that bat file, and put a checkmark next to "Always use this app to open .pl files." and click on OK.

      I'm not finding this functionality. I either get to open this with an existing app or one that MS is gonna sell me.

      It took me a while to realize that there is no run command in neither dos nor bash:

      C:\Users\tblaz\Documents\evelyn>run 8.monk.tag 'run' is not recognized as an internal or external command, operable program or batch file. C:\Users\tblaz\Documents\evelyn>
      tblaz@LAPTOP-ECV9SQTM MINGW64 ~/Documents/evelyn $ run anything bash: run: command not found tblaz@LAPTOP-ECV9SQTM MINGW64 ~/Documents/evelyn $

      When you suggest syntax like this:

      C:\Users\tblaz\Desktop>run example.pl

      , it is because you have a run.bat in the path. I have a nomenclature where I prefer to put a numeral first on any file I can. I copied the idea tho and have this:

      C:\Strawberry\perl\site\bin>type 2.run.bat @ECHO OFF rem set env variables set TERM=dumb set PERL_JSON_BACKEND=JSON::XS set PERL_YAML_BACKEND=YAML rem avoid collisions with other perl stuff on your system rem set PERL5LIB= set PERL5OPT= set PERL_MM_OPT= set PERL_MB_OPT= rem change encoding to show cyrillic chars chcp 65001 rem show which perl perl -e "printf("""Perl executable: %%s\nPerl version : %%vd\n""", $ +^X, $^V)" 2>nul if ERRORLEVEL==1 echo.&echo FATAL ERROR: 'perl' does not work; check i +f your strawberry pack is complete! C:\Strawberry\perl\bin\perl.exe "%1" %2 %3 ECHO. PAUSE cmd \K C:\Strawberry\perl\site\bin>

      Changing the active code page is a definite plus. Now, instantiated back where my perl scripts are:

      C:\Users\tblaz\Documents\evelyn>2.run.bat 2.cyr.pl Active code page: 65001 Perl executable: C:\Strawberry\perl\bin\perl.exe Perl version : 5.30.0 ... Content-Type: text/html; charset=utf-8 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Мой тест</title> </head> <body> Бакс2811 </body> </html> Press any key to continue . . .

      I'm happy with the results. There was nothing in this directory before today, so I think it's a fine place for such scripts. (?)

      Directory of C:\Strawberry\perl\site\bin 10/21/2019 04:00 PM <DIR> . 10/21/2019 04:00 PM <DIR> .. 10/21/2019 12:56 PM 71 1.run.bat 10/21/2019 04:15 PM 581 2.run.bat 2 File(s) 652 bytes 2 Dir(s) 453,237,977,088 bytes free

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11107682]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2019-11-19 23:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Strict and warnings: which comes first?



    Results (96 votes). Check out past polls.

    Notices?