2012-04-25 3 views
2

простой пример и я не знаю, как заставить его работать ...Powershell заменить функция странное поведение

function replace($rep, $by){ 
    Process { $_ -replace $rep, $by } 
} 

когда я

"test" | replace("test", "foo") 

результат

test 

Когда я делаю

function replace(){ 
    Process { $_ -replace "test", "foo" } 
} 

"test" | replace() 

результат

foo 

любая идея?

ответ

3

функция в PowerShell следует тем же правилам, как аргумент командлеты и родные команды, то есть аргументы разделяются пробелами (и да, это также означает, что вам не нужно цитировать ваши аргументы, поскольку они автоматически интерпретировано как строки в этом режиме синтаксического анализа):

'test' | replace test foo 

так что, если вы вызываете функцию PowerShell или командлет с аргументами в скобках вы получите один аргумент, который является массивом внутри функции. Вызовы методов на объектах соответствуют другим правилам (которые выглядят примерно так же, как на C#).

Выработать немного: PowerShell имеет два различных режима, в котором он анализирует строку: режим выражение режим и команда. В режиме выражения PowerShell ведет себя как REPL. Вы можете ввести 1+1 и получить 2 назад, или введите 'foo' -replace 'o' и получите f назад. Командный режим предназначен для имитации поведения оболочки. Вот когда вы хотите запустить команду, например. Get-ChildItem или & 'C:\Program Files\Foo\foo.exe' bar blah. В скобках начинается определение режима, поэтому Write-Host (Get-ChildItem) отличается от Write-Host Get-ChildItem.

+0

спасибо! вчера начался вчерашний день, и мне не хватает такой базы. – rbag

+0

Вначале это может быть немного запутанным, особенно из C-подобных языков или оболочек Unix, но разработчики языка приложили все усилия, чтобы вы могли изучить несколько концепций и повторно использовать их во время работы с PowerShell. Небольшой намек: 'filter' ведет себя так же, как' function' с блоком 'process', поэтому вы можете немного упростить свой код для замены фильтра ($ rep, $ by) {$ _ -replace $ rep, $ by } ' – Joey

+0

, исходящий из C#, иногда немного запутывается, но powershell кажется очень мощной альтернативой нечитаемым скриптам vbs или скомпилированному приложению C#. thx для наконечника фильтра! – rbag

0

Удалите() в своем функциональном вызове и remove comma.

"test" | replace "test" "foo" 
Смежные вопросы