Giter VIP home page Giter VIP logo

Comments (3)

malxau avatar malxau commented on May 18, 2024

I'm tempted to say that this is a bug in CMD, although I realize that's unhelpful. I'll try messing around with this when I have some spare time to see what it's willing to accept.

This bug occurs because foo.cmd is a CMD script, so Yori is trying to construct a command to execute CMD with the specified script. In this case, it will build:

C:\Windows\system32\cmd.exe /c "C:\Program Files\Foo\bin\foo.cmd" "--help"

If you type this command into CMD, you'll see the error above. The error is coming from CMD, not Yori. It looks like CMD is taking everything following the "/c" as a single string, and parsing it again, losing the benefit of the quotes. So it tries to execute:

C:\Program Files\Foo\bin\foo.cmd --help

which confuses CMD because it can't resolve the script name.

What's odd is that

C:\Windows\system32\cmd.exe /c "C:\Program Files\Foo\bin\foo.cmd" --help

does resolve the script name correctly. It really looks like CMD is looking for the final quote -- being greedy -- then taking the string in the middle and re-parsing it. But if that's true, the question is how to tell it what the real script name is.

from yori.

dmitri-gb avatar dmitri-gb commented on May 18, 2024

Aha, interesting!

The examples on ss64.com suggest that in cases like this, one should add extra quotes around the whole command string. So to make my example work, Yori should execute

C:\Windows\system32\cmd.exe /c ""C:\Program Files\Foo\bin\foo.cmd" "--help""

The relevant part from CMD help is this:

If /C or /K is specified, then the remainder of the command line after
the switch is processed as a command line, where the following logic is
used to process quote (") characters:

    1.  If all of the following conditions are met, then quote characters
        on the command line are preserved:

        - no /S switch
        - exactly two quote characters
        - no special characters between the two quote characters,
          where special is one of: &<>()@^|
        - there are one or more whitespace characters between the
          two quote characters
        - the string between the two quote characters is the name
          of an executable file.

    2.  Otherwise, old behavior is to see if the first character is
        a quote character and if so, strip the leading character and
        remove the last quote character on the command line, preserving
        any text after the last quote character.

Basically, case 1 is the reason this works:

C:\Windows\system32\cmd.exe /c "C:\Program Files\Foo\bin\foo.cmd" --help

however case 1 only applies in limited situations ("exactly two quote characters"), so the aim should be to always trigger case 2. This can also be forced with the /S switch.

from yori.

malxau avatar malxau commented on May 18, 2024

I just released 1.21 which I believe fixes this issue. You can upgrade an existing install with ypm -u. If you find any additional problems, please either reopen this issue or file a new one describing that problem. Thanks for the report!

from yori.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.