Search code examples
powershellshellcommand-promptjasypt

Jasypt unable to read literal ampersand on windows?


Below command:

C:\users\xxx\jasypt-1.9.3\bin> ./encrypt.bat password=password input=test.com/test?v=v&w=w

complains questions mark ("&") is not allowed. So I tried escaping it as "&" or ^& but Jasypt seemed to strip & and what comes after it.

C:\users\xxx\jasypt-1.9.3\bin> ./encrypt.bat password=password input=test.com/test?v=v^&w=w
...
----ARGUMENTS-------------------
input: test.com/test?v=v
password: password
...
'w' is not recognized as an internal or external command,
operable program or batch file.

How would I make it so that Jasypt reads it as literal ampersand or is this a windows thing?


Solution

  • PowerShell's escape character is ` (backtick), not ^, which is specific to cmd.exe.

    However, an unquoted & is a metacharacter (a character with special syntactic meaning) in both shells.

    Therefore, to ensure that PowerShell passes & through as-is to ./encrypt.bat, all of the following variations work (since your argument contains no references to PowerShell variables ($...), "..." (expandable (interpolating) string) and '...' (literal string) can be used interchangeably):

    ./encrypt.bat password=password input=test.com/test?v=v`&w=w
    
    ./encrypt.bat password=password input=test.com/test?v=v"&"w=w
    
    ./encrypt.bat password=password input=test.com/test?v=v'&'w=w
    
    ./encrypt.bat password=password "input=test.com/test?v=v&w=w"
    
    ./encrypt.bat password=password 'input=test.com/test?v=v&w=w'
    

    Since you say that it is ./encryp.bat that complained, the implication is that ./encrypt.bat is poorly implemented and doesn't use "..." to further process the arguments it receives, causing cmd.exe metacharacters such as & to break processing.

    To counteract that, you must additionally anticipate cmd.exe's escaping needs and include a literal ^ in the argument passed from PowerShell:

    ./encrypt.bat password=password 'input=test.com/test?v=v^&w=w'