Используя http://phrogz.net/JS/ArraySetMath.js , вы можете:
var array1 = ["test1", "test2","test3", "test4"];
var array2 = ["test1", "test2","test3","test4", "test5", "test6"];
var array3 = array2.subtract( array1 );
// ["test5", "test6"]
var array4 = array1.exclusion( array2 );
// ["test5", "test6"]
Когда вы заключаете имя переменной в строку с двойными кавычками, оно будет заменено значением этой переменной:
$foo = 2
"$foo"
становится
"2"
Если вы не хотите, чтобы вы использовали одиночные кавычки:
$foo = 2
'$foo'
Однако, если вы хотите получить доступ к свойствам или использовать индексы для переменных в строке с двойными кавычками, вы должны заключить это подвыражение в $ ()
:
$foo = 1,2,3
"$foo[1]" # yields "1 2 3[1]"
"$($foo[1])" # yields "2"
$bar = "abc"
"$bar.Length" # yields "abc.Length"
"$($bar.Length)" # yields "3"
PowerShell расширяет только переменные в тех случаях не более того. Чтобы принудительно вычислить более сложные выражения, включая индексы, свойства или даже полные вычисления, вы должны заключить их в оператор подвыражения $ ()
, который заставляет внутреннее выражение вычисляться и вставляться в строку.
@Joey имеет правильный ответ, но просто чтобы добавить еще немного, почему вам нужно принудительно выполнять оценку с помощью $ ()
:
Ваш пример кода содержит двусмысленность, которая указывает на то, почему создатели PowerShell, возможно, решили ограничить расширение простыми ссылками на переменные и не поддерживать также доступ к свойствам (в стороне: расширение строки выполняется путем вызова ToString ()
на объекте, который может объяснить некоторые "странные" результаты).
Ваш пример содержится в самом конце командной строки:
...\$LogFileName.ldf
Если бы свойства объектов были расширены по умолчанию, приведенное выше преобразовалось бы в
...\
, поскольку объект, на который ссылается $ LogFileName
, не будет иметь свойство под названием ldf
,