Динамический разбор строк в Powershell - PullRequest
2 голосов
/ 18 февраля 2011

Я пытаюсь сделать что-то необычное с анализом Powershell. По сути, у меня есть литеральная строка, которая содержит имя переменной. Что я хотел бы сделать, так это сказать powershell: «Эй, у меня есть строка, которая (может) содержать одно или несколько имен переменных - динамически анализировать ее, заменяя имена переменных их значениями» *

Вот учебник, как я понимаю парсинг работает:

PS C:\> $foo = "Rock on"
PS C:\> $bar = "$foo"
PS C:\> $bar
Rock on

А если я сейчас изменю значение на $ foo:

PS C:\> $foo = "Rock off"
PS C:\> $bar
Rock on

Здесь нет сюрпризов. Значение $ bar было проанализировано в том виде, в котором оно было присвоено, и не изменилось просто потому, что изменилось значение $ foo.

Хорошо, а что, если мы назначим $ bar одинарной кавычкой?

PS C:\> $foo = "Rock on"
PS C:\> $bar = '$foo'
PS C:\> $bar
$foo

Это здорово, но есть ли способ заставить Powershell анализировать его по требованию? Например:

PS C:\> $foo = "Rock on"
PS C:\> $bar = '$foo'
PS C:\> $bar
$foo
PS C:\> Some-ParseFunction $bar
Rock on
PS C:\> $foo = "Rock off"
PS C:\> Some-ParseFunction $bar
Rock off

Почему я хочу это сделать? Я хотел бы иметь возможность получать содержимое из файла (или некоторого источника данных) и динамически анализировать его:

PS C:\> $foo = "Rock on"
PS C:\> '$foo with your bad self.' | out-file message.txt
PS C:\> $bar = (get-content message.txt)
PS C:\> $bar
$foo with your bad self.
PS C:\> Some-ParseFunction $bar
Rock on with your bad self.

Можно ли это сделать? Я понимаю, что мог бы выполнить какое-то сопоставление с шаблоном для поиска / замены известных имен, но я бы предпочел, чтобы Powershell повторил строку.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011
0 голосов
/ 18 февраля 2011

Я написал функцию convertto-herestring, которая делает именно это:

 $foo = "Rock on"
 '$foo with your bad self.' | out-file message.txt

 function convertto-herestring { 
 begin {$temp_h_string = '@"' + "`n"} 
 process {$temp_h_string += $_ + "`n"} 
 end { 
     $temp_h_string += '"@' 
     iex $temp_h_string 
    } 
} 

  gc message.txt | convertto-herestring

  Rock on with your bad self.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...