Я хочу передать из скрипта 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