Как передать аргумент, который может содержать кавычки и символы, не входящие в ASCII, из PowerShell во внешнюю программу? - PullRequest
3 голосов
/ 23 июня 2019

Я хочу передать из скрипта PowerShell внешние (CygWin) программные аргументы (пути к файлам), которые содержат произвольные символы, включая одинарные, двойные, обратные слэши, пробелы и символы, не входящие в ASCII. С помощью некоторых непонятных способов пропадают одинарные и двойные кавычки, а рекомендованный рекомендуемый механизм цитирования недостаточен для решения проблемы. В частности, двойные кавычки в начале строки заменяются обратной косой чертой, одинарные кавычки в начале или конце строки теряются, а одинарные кавычки мешают не-ASCII-символам непредсказуемым образом.

В качестве примера рассмотрим скрипт оболочки echo-first.sh sh , который повторяет свой первый аргумент.

#!/bin/sh
echo "$1"

Вот вывод Windows PowerShell (5.1), когда я запускаю сценарий с различными аргументами, каждый из которых начинается с комментария, указывающего, верен ли вывод.

# OK: hello world
bash ./echo-first.sh "hello world"

# Not OK: double
bash ./echo-first.sh 'double " quote'

# Not OK: double quoted
bash ./echo-first.sh '"double quoted"'

# OK: double " quote
bash ./echo-first.sh ('double " quote' -replace  '"', '\"')

# Not OK: \double quoted"
bash ./echo-first.sh ('"double quoted"' -replace  '"', '\"')

# OK: A "double quoted" phrase
bash ./echo-first.sh ('A "double quoted" phrase' -replace  '"', '\"')

# OK: single ' quote
bash ./echo-first.sh "single ' quote"

# OK: 'single quoted'
bash ./echo-first.sh "'single quoted'"

# Not OK: [no output]
bash ./echo-first.sh "'"

# Not OK: [no output]
bash ./echo-first.sh "''"

# OK: ''
Write-Output "''"

# OK: αβ''γ
bash ./echo-first.sh "αβ''γ"

# Not OK: αβγδ
bash ./echo-first.sh "αβγ''δ"

# OK: αβγδεζηθικλμ
bash ./echo-first.sh "αβγδεζηθικλμ"

# Not OK: αβγδεζηθικλμ#
bash ./echo-first.sh "αβ''γδεζηθικλμ"

# Major  Minor  Build  Revision
# -----  -----  -----  --------
# 5      1      18362  145
Write-Output $PSVersionTable.PSVersion                                                                       
...