2015-11-05 3 views
2

Я: новичок питания оболочки, и я не в состоянии понять это очень простой код, и возникает вопрос:Run PowerShell из Powershell строки с параметрами

У меня есть базовый сценарий C: \ Папка \ abc.ps1 :

function abc 
{ 
Param( 
     [parameter(Mandatory=$false] 
     $Env 
} 

Write-Output "The parameter is: $Env" 
} 
abc $Env 

Теперь называя этот сценарий из командной строки:

C:\Dev> . "c:\Folder\abc.ps1" "Dev" 
The parameter is: 
C:\Dev> . "c:\Folder\abc.ps1" "Dev" 
The parameter is: 

Теперь, если я инициализировать En v то это работает;

C:\Dev> $Env = "Dev" 
C:\Dev> . "c:\Folder\abc.ps1" 
C:\Dev> The parameter is: Dev 

Я хотел бы сделать это в одной строке, как указано выше, из любого места, а не в папку, в которой он находится. Я использую скорлупу питания из командной строки оболочки питания в среде Windows

вашей помощи оценила

+0

Ваш первый скрипт не принимает аргументы. Вот почему он ничего не делает, когда вы передаете ему строку. Также избегайте использования '$ env', поскольку это то же имя, что и переменная среды. – Matt

ответ

1

Несколько вариантов здесь.

Вы можете позвонить, используя следующую инструкцию, чтобы установить значение $ ENV

.\abc.ps1 -env "dev" 

Или вы можете обновить свой код, чтобы извлечь значение параметров, которые Вы передаете в которых безымянные. Они хранятся в массиве с именем $ args.

function abc 
{ 
} 

$env=$args[0] 

Write-Output "The parameter is: $env" 
abc $env 

И затем вызвать эту функцию как

"c:\Folder\abc.ps1" "Dev" 
+0

Спасибо, но должен быть способ запустить это из одной командной строки и не устанавливать ее раньше. Я использую систему сборки для запуска оболочки питания, поэтому, к сожалению, нет такой свободы. – Akshay

+0

@Akshay Я не понимаю, почему вы думаете, что что-то вроде этого не работает. – Matt

+0

@Akshay Не совсем уверен, что вы подразумеваете под «настройкой перед». Оба эти параметра работают из одной командной строки. –

0

Ваш первый скрипт не делает ничего с аргументами передается. Вот почему ваш первый пример не выводит ожидаемый результат. $env всегда равно нулю.

В этой теме не следует использовать $env как переменную, так же как и поставщик, используемый для переменных среды. Хотя, что не имеет ничего общего с вашей проблемой. Просто знайте, что это нечто, чего можно избежать, поскольку это может быть причиной будущих проблем или путаницы.

Причина, по которой ваш второй вызов кода работает, заключается в использовании dot operator.

. Dot Sourcing оператор

Запускает скрипт в текущей области так, что любые функции, псевдонимов и переменные, что скрипт создает добавляется к текущей области.

Если вы хотите, чтобы ваш первый скрипт работал, вам нужно обработать аргументы. answer by Alec Collier охватывает простой подход. Используйте переменную $args. Существует несколько других, и примечательный - param так же, как вы использовали в своей функции.

Param( 
    [parameter(position=0, 
     Mandatory=$false)] 
    $bagel 
) 

function abc { 
    Param( 
     [parameter(Mandatory=$false)] 
     $value 
    ) 

    Write-Output "The parameter is: $value" 
} 

abc $bagel 

И тогда сценарий можно назвать так же, как и вы.

. "c:\Folder\abc.ps1" "Dev" 
0

С простым изменением от } характера к ) характера, который, кажется, ошибка с вашей стороны, ваш сценарий должен работать абсолютно нормально.

Я говорю об этом:

Param( 
    [parameter(Mandatory=$false] 
    $Env 
} <------------- 

Обратите внимание, как открытая скобка круглая скобка, не фигурная скобка. Поставив фигурные скобки, вы закрываете функцию, поэтому ничего не работает.

Смежные вопросы