284

カスタム関数を定義したい.ps1ファイルがあります。

ファイルの名前がMyFunctions.ps1で、内容が次のようになっているとします。

Write-Host "Installing functions"
function A1
{
    Write-Host "A1 is running!"
}
Write-Host "Done"

このスクリプトを実行し、理論的にA1関数を登録するには、.ps1ファイルが存在するフォルダーに移動して、ファイルを実行します。

.\MyFunctions.ps1

これは以下を出力します:

Installing functions
Done

それでも、A1を呼び出そうとすると、その名前のコマンド/関数がないというエラーが表示されます。

The term 'A1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
 of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:3
+ A1 <<<<
    + CategoryInfo          : ObjectNotFound: (A1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PowerShellの概念を誤解する必要があります。スクリプトファイルで関数を定義できませんか?

実行ポリシーを「RemoteSigned」に設定していることに注意してください。そして、ファイル名の前にドットを使用して.ps1ファイルを実行することを知っています:。\ myFile.ps1

4

7 に答える 7

299

PowerShellコマンドラインでこれを試してください。

. .\MyFunctions.ps1
A1

ドット演算子は、スクリプトインクルード、別名「ドットソーシング」(または「ドットソース表記」)に使用されます。

于 2011-05-16T11:22:42.630 に答える
266

あなたが話しているのはドットソーシングと呼ばれています。そしてそれは悪です。しかし、心配する必要はありません。モジュールを使ってやりたいことを行うためのより良い、より簡単な方法があります(それはそれよりもずっと怖いように聞こえます)。モジュールを使用する主な利点は、必要に応じてモジュールをシェルからアンロードできることです。これにより、関数内の変数がシェルに忍び寄るのを防ぎます(関数ファイルをドットソース化したら、から変数の1つを呼び出してみてください)シェルで機能し、私が何を意味するかがわかります)。

したがって、最初に、すべての関数を含む.ps1ファイルの名前をMyFunctions.psm1に変更します(モジュールを作成したばかりです)。モジュールを正しくロードするには、ファイルを使用して特定の処理を行う必要があります。まず、Import-Moduleがモジュールを表示するために(このコマンドレットを使用してモジュールをシェルにロードします)、特定の場所にある必要があります。モジュールフォルダーへのデフォルトのパスは、$ home \ Documents \ WindowsPowerShell\Modulesです。

そのフォルダーに、MyFunctionsという名前のフォルダーを作成し、その中にMyFunctions.psm1ファイルを配置します(モジュールファイルは、PSM1ファイルとまったく同じ名前のフォルダーに存在する必要があります)。

それが完了したら、PowerShellを開き、次のコマンドを実行します。

Get-Module -listavailable

MyFunctionsと呼ばれるものが表示された場合は、それを正しく実行し、モジュールをロードする準備ができています(これは、これが正しく設定されていることを確認するためのものであり、これを1回だけ実行する必要があります)。

モジュールを使用するには、シェルに次のように入力します(または、この行を$ profileに配置するか、これをスクリプトの最初の行として配置します)。

Import-Module MyFunctions

これで、関数を実行できます。これのすばらしい点は、10〜15個の関数が含まれていると、カップルの名前を忘れてしまうことです。モジュールにそれらがある場合は、次のコマンドを実行して、モジュール内のすべての関数のリストを取得できます。

Get-Command -module MyFunctions

それはかなり甘いです、そしてそれが正面にセットアップするのにかかるほんの少しの努力はそれだけの価値があります。

于 2011-05-18T06:29:55.833 に答える
20

. "$PSScriptRoot\MyFunctions.ps1" MyA1Func

v3以降で利用可能です。その前に、PowerShellスクリプトのファイルシステムの場所を取得するにはどうすればよいですか?を参照してください。。それは非常に一般的です。

PS私は「すべてがモジュールである」ルールに同意していません。私のスクリプトはGIT以外の他の開発者によって使用されているため、スクリプトを実行する前に、特定の場所に何かを配置したり、システム環境変数を変更したりするのは好きではありません。それは単なるスクリプト(または2つまたは3つ)です。

于 2015-02-05T15:33:43.873 に答える
7

確かに、スクリプトファイルで関数を定義できます(ロード時にPowershellプロファイルを介して関数をロードする傾向があります)。

まず、以下を実行して関数がロードされていることを確認する必要があります。

ls function:\ | where { $_.Name -eq "A1"  }

そして、それがリストに表示されていることを確認し(1のリストである必要があります!)、どのような出力が得られるかをお知らせください。

于 2011-05-16T11:30:22.647 に答える
6

次の機能を追加できます。

c:\Users\David\Documents\WindowsPowerShell\profile.ps1

機能が利用可能になります。

于 2017-06-24T19:35:57.880 に答える
4

ファイルに呼び出し/公開するメイン関数が1つしかない場合は、次のコマンドでファイルを開始することもできます。

Param($Param1)

次に、たとえば次のように呼び出すことができます。

.\MyFunctions.ps1 -Param1 'value1'

これにより、関数をインポートせずにその関数だけを簡単に呼び出したい場合に、はるかに便利になります。

于 2017-10-01T22:10:30.573 に答える
1

Function-Dumb()というメソッドを持つDummy-Name.psm1というモジュールファイルがあるとします。

Import-Module "Dummy-Name.psm1";
Get-Command -Module "Function-Dumb";
#
#
Function-Dumb;
于 2018-10-02T00:17:59.447 に答える