tl; др:
Опция самая безопасная всегда использовать явные двойные кавычки для соединения аргументы , так что обычное раскрытие строки (интерполяция) правила применяются .
Применяются к вашим примерам (IЯ использую Write-Output
, потому что это echo
является псевдонимом в PowerShell):
Write-Output "$a$b" # example 1
Write-Output "$a\$b" # example 2
Write-Output "$a\$($f.BaseName)" # example 4 - note the required $(...)
Единственное исключение - пример 3, потому что там вы не имеете дело с аргумент, а скорее одиночное выражение :
Write-Output $f.BaseName # example 3: OK without quoting
Write-Output "$($f.BaseName)" # equivalent with double-quoting
PowerShell в основном обрабатывает составные аргументы , как если бы они были строки в двойных кавычках (то есть расширяемые), но в конечном итоге слишком много исключений , чтобы это поведение было полезным .
Эта проблема GitHub обобщает все удивительные поведения.
Что касается ваши конкретные вопросы :
Я не могу объединить переменные с othПеременные свойства (пример 4).
На самом деле, echo $a\$f.BaseName
- это случай, когда составной токен неявно обрабатывается так, как если бы он был заключен в "..."
, и именно из-за того, что вам нужнозаключить $f.BaseName
в $(...)
, потому что это то, что требуют правила раскрытия строки .
echo $a\$($f.BaseName)
Я понимаю, что могу сделать это, используя выражения стиля $()
Например: echo $($a + '\' + $f.BaseName)
На самом деле, лучше и эффективнее просто использовать (...)
в этом случае, потому что вы хотите оценить это одиночное выражение :
echo ($a + '\' + $f.BaseName)
полезный ответ briantist имеет больше различий между (...)
(только для одного оператора) и $(...)
(несколько операторов, с конвейерной логикой).