Установили PowerShell
в Linux и создали пользовательскую функцию, как показано ниже, и сохранили ее как test.ps1
. Теперь, как мне вызвать функцию ttr
, передав значение в $file
и $name
.
#!/usr/bin/env pwsh
function ttr {
Param(
$file,
$name
)
Write-Host $file
Write-Host $name
}
Пытался вызвать его из другого скрипта, вызов функции из того же скрипта работает, как ожидалось
Возможный дубликат Как вызвать функцию в другом сценарии PowerShell при выполнении сценария PowerShell с помощью «Запускать с помощью PowerShell»
Вышеупомянутая ссылка относится к среде Windows, но я установил ядро PowerShell в Linux и пытаюсь вызвать функцию через другой скрипт.
Ключевым моментом связанного вопроса является попытка вызвать функцию, определенную в одном сценарии, из другого сценария; Несмотря на то, что в заголовке специально упоминается использование пункта контекстного меню «Выполнить с PowerShell» для вызова сценария, я не считаю, что это важно для проблемы. Что касается этого вопроса, я не верю, что вызов функций отличается в Windows и Linux - в противном случае сценарии PowerShell не могли бы переноситься между платформами, поэтому ответ на вопрос будет одинаковым для обеих сред.
Чтобы сделать функцию PowerShell доступной вне скрипта PowerShell, вам необходимо запустить скрипт, чтобы в него загружались любые переменные или функции.
Для этого вам нужно будет написать функцию как "global: ttr", а затем запустить скрипт. Переменные требуют, чтобы вы записали их как "$ global: varname".
Впоследствии, на время работы текущей оболочки, у вас будет доступ к указанной функции и переменной.
@BACON Это, вероятно, должен быть отдельный ответ, а не комментарий по этому вопросу
@ Энди Это справедливый вопрос. Честно говоря, я никогда не видел функций, добавляемых в глобальную область видимости для выполнения этого, поэтому мой комментарий был действительно мягким способом сказать: «Да, это способ сделать это, но я не думаю, что это / должно быть. рекомендуемые." Мне также еще не ясно, что автор вопроса пытается вызвать функцию извне скрипта.
Я только что запустил ваш образец почтового кода в OSX, в редакторе VSCode, на обоих терминалах и через обычный терминал PSCore по умолчанию, и он работал, как ожидалось.
Кроме того, помните правильную конструкцию именования в PowerShell, если глагол-существительное. Итак, ваша функция должна быть строкой New-ttr.
#!/usr/bin/env pwsh
function New-ttr{
Param(
$file,
$name
)
write-host $file
write-host $name
}
Итак, я сохранил код как test.ps1 в своей папке загрузок и выполнил с…
~/downloads/test.ps1
... с каждого из терминалов. Запуск в редакторе VSCode - это просто вопрос выбора текста ...
function New-ttr{
Param(
$file,
$name
)
$file
$name
}
New-ttr -$file Somefilename -name somename
выберите терминал и запустите выделенный текст или запустите Active File. Наконец, не используйте Write-Host, если вы не раскрашиваете вывод текста на экране или не выполняете другие необходимые условия форматирования. По умолчанию вывод на экран.
Итак, это ...
write-host $file
write-host $name
.. и это...
$file
$name
… Будет делать то же самое.
Write-Host не поддерживает конвейер и очищает буфер, поэтому его использование категорически не рекомендуется.
Если вы хотите использовать запись для вывода на экран, рассмотрите возможность использования Write-Output или одного из других командлетов Write- *.
Хотя я не уверен, почему вы передаете и params $ file, и $ name даже в этом тесте. Я предполагаю, что один - это путь, а другой - имя файла, который нужно искать. Вы можете просто передать полный путь к файлу в $ file и извлечь имя с помощью $ file.Name.
Я уверен, что может быть какой-то другой способ, но этот сработал для меня.
Сохранил приведенный ниже файл в /tmp/testscript.ps1
.
#!/usr/bin/env pwsh
function New-ttr{
Param(
$file,
$name
)
write-host $file
write-host $name
}
создал еще один скрипт, как показано ниже, и сохранил в /tmp/callscript.ps1
#!/usr/bin/env pwsh
import-module /tmp/testscript.ps1
New-ttr -file "Test call in PSCore" -name "Testing"
тогда
chmod 777 callscript.ps1
./tmp/callscript.ps1
Откуда вы хотите вызвать функцию: тот же сценарий, другой сценарий, интерактивное приглашение PowerShell? Как вы пробовали вызвать функцию? Вы ознакомились с документацией
about_Functions
?