Экранирующий символ PowerShell - `
(обратный тик), а не ^
, который указывает c на cmd.exe.
Однако без кавычек &
является метасимволом (символ со специальным значением syntacti c) в обеих оболочках.
Следовательно, , чтобы гарантировать, что PowerShell передает &
через ./encrypt.bat
как есть, все следующие варианты работают (поскольку ваш аргумент не содержит ссылок на переменные PowerShell ($...
), "..."
(расширяемый ( (интерполирующая) строка) и '...'
(буквальная строка) могут использоваться взаимозаменяемо):
./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'
Поскольку вы говорите, что ./encryp.bat
подал жалобу , подразумевается, что ./encrypt.bat
плохо реализован и не использует "..."
для дальнейшей обработки аргументов, которые он получает , в результате чего cmd.exe
метасимволы, такие как &
, прерывают обработку.
Чтобы противостоять этому, вы должны дополнительно предвидеть побег cmd.exe
урожденной ds и включите литерал ^
в аргумент, передаваемый из PowerShell:
./encrypt.bat password=password 'input=test.com/test?v=v^&w=w'