Как вызвать функцию PowerShell в Linux

Установили PowerShell в Linux и создали пользовательскую функцию, как показано ниже, и сохранили ее как test.ps1. Теперь, как мне вызвать функцию ttr, передав значение в $file и $name.

#!/usr/bin/env pwsh

function ttr {
    Param(
             $file,
             $name
         )
    Write-Host $file
    Write-Host $name
}

Откуда вы хотите вызвать функцию: тот же сценарий, другой сценарий, интерактивное приглашение PowerShell? Как вы пробовали вызвать функцию? Вы ознакомились с документацией about_Functions?

Lance U. Matthews 13.09.2018 00:42

Пытался вызвать его из другого скрипта, вызов функции из того же скрипта работает, как ожидалось

SUN 13.09.2018 01:34

Вышеупомянутая ссылка относится к среде Windows, но я установил ядро ​​PowerShell в Linux и пытаюсь вызвать функцию через другой скрипт.

SUN 13.09.2018 06:13

Ключевым моментом связанного вопроса является попытка вызвать функцию, определенную в одном сценарии, из другого сценария; Несмотря на то, что в заголовке специально упоминается использование пункта контекстного меню «Выполнить с PowerShell» для вызова сценария, я не считаю, что это важно для проблемы. Что касается этого вопроса, я не верю, что вызов функций отличается в Windows и Linux - в противном случае сценарии PowerShell не могли бы переноситься между платформами, поэтому ответ на вопрос будет одинаковым для обеих сред.

Lance U. Matthews 13.09.2018 07:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 471
3

Ответы 3

Чтобы сделать функцию PowerShell доступной вне скрипта PowerShell, вам необходимо запустить скрипт, чтобы в него загружались любые переменные или функции.

Для этого вам нужно будет написать функцию как "global: ttr", а затем запустить скрипт. Переменные требуют, чтобы вы записали их как "$ global: varname".

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

Точечный источник - альтернативный способ сделать это, и я считаю, что это также более типичный подход.
Lance U. Matthews 13.09.2018 00:54

@BACON Это, вероятно, должен быть отдельный ответ, а не комментарий по этому вопросу

Andy 13.09.2018 01:15

@ Энди Это справедливый вопрос. Честно говоря, я никогда не видел функций, добавляемых в глобальную область видимости для выполнения этого, поэтому мой комментарий был действительно мягким способом сказать: «Да, это способ сделать это, но я не думаю, что это / должно быть. рекомендуемые." Мне также еще не ясно, что автор вопроса пытается вызвать функцию извне скрипта.

Lance U. Matthews 13.09.2018 01:25

Я только что запустил ваш образец почтового кода в 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

Другие вопросы по теме