Saya memiliki file .ps1 di mana saya ingin mendefinisikan fungsi khusus.
Bayangkan file tersebut bernama MyFunctions.ps1, dan isinya adalah sebagai berikut:
Write-Host "Installing functions"
function A1
{
Write-Host "A1 is running!"
}
Write-Host "Done"
Untuk menjalankan skrip ini dan secara teoritis mendaftarkan fungsi A1, saya menavigasi ke folder tempat file .ps1 berada dan menjalankan file:
.\MyFunctions.ps1
Output ini:
Installing functions
Done
Namun, ketika saya mencoba menelepon A1, saya hanya mendapatkan kesalahan yang menyatakan bahwa tidak ada perintah / fungsi dengan nama itu:
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
Saya harus salah paham beberapa konsep PowerShell. Bisakah saya tidak mendefinisikan fungsi dalam file skrip?
Perhatikan bahwa saya telah menetapkan kebijakan eksekusi ke 'RemoteSigned'. Dan saya tahu untuk menjalankan file .ps1 menggunakan titik di depan nama file:. \ MyFile.ps1
powershell
Willem
sumber
sumber
Jawaban:
Coba ini di baris perintah PowerShell:
Operator titik digunakan untuk skrip termasuk.
sumber
. "$PSScriptRoot\MyFunctions.ps1"
. Availalbe dimulai pada v3, sebelum itu lihat stackoverflow.com/questions/3667238/… . Ini SANGAT umum.Apa yang Anda bicarakan disebut dot sourcing . Dan itu jahat. Tapi jangan khawatir, ada cara yang lebih baik dan lebih mudah untuk melakukan apa yang Anda inginkan dengan modul (kedengarannya jauh lebih menakutkan daripada itu). Manfaat utama menggunakan modul adalah Anda dapat membongkar modul-modul tersebut dari shell jika perlu, dan itu membuat variabel-variabel di dalam fungsi tidak masuk ke dalam shell (begitu Anda dot sumber file fungsi, coba panggil salah satu variabel dari berfungsi dalam shell, dan Anda akan melihat apa yang saya maksud).
Jadi pertama-tama, ganti nama file .ps1 yang memiliki semua fungsi Anda di dalamnya menjadi MyFunctions.psm1 (Anda baru saja membuat modul!). Sekarang agar modul memuat dengan benar, Anda harus melakukan beberapa hal spesifik dengan file tersebut. Pertama untuk Modul Impor untuk melihat modul (Anda menggunakan cmdlet ini untuk memuat modul ke dalam shell), itu harus di lokasi tertentu. Path default ke folder modules adalah $ home \ Documents \ WindowsPowerShell \ Modules.
Dalam folder itu, buat folder bernama MyFunctions, dan tempatkan file MyFunctions.psm1 ke dalamnya (file modul harus berada di folder dengan nama yang persis sama dengan file PSM1).
Setelah selesai, buka PowerShell, dan jalankan perintah ini:
Jika Anda melihat yang disebut MyFunctions, Anda melakukannya dengan benar, dan modul Anda siap dimuat (ini hanya untuk memastikan bahwa ini diatur dengan benar, Anda hanya perlu melakukan ini satu kali).
Untuk menggunakan modul, ketikkan yang berikut di shell (atau letakkan baris ini di $ profile Anda, atau letakkan ini sebagai baris pertama dalam skrip):
Anda sekarang dapat menjalankan fungsi Anda. Yang keren tentang ini adalah bahwa sekali Anda memiliki 10-15 fungsi di sana, Anda akan melupakan nama pasangan. Jika Anda memilikinya di dalam modul, Anda dapat menjalankan perintah berikut untuk mendapatkan daftar semua fungsi di modul Anda:
Ini cukup manis, dan sedikit usaha yang diperlukan untuk mengatur di sisi depan adalah WAY worth it.
sumber
Import-Module .\buildsystem\PSUtils.psm1
.
denganImport-Module
mengubah dan mengganti nama ekstensi, dan tidak memerlukan modul untuk ditempatkan di folder tertentu, yaitu saya dapat memilikinya di direktori yang saya inginkan, seperti halnya dengan dot sourcing, adalah apakah ada alasan untuk melakukan dot sourcing melalui modul, mengingat manfaat yang datang untuk pelingkupan? (kecuali tentu saja "masalah" ruang lingkup itu yang Anda inginkan). "$PSScriptRoot\MyFunctions.ps1" MyA1Func
Availalbe dimulai pada v3, sebelum itu lihat Bagaimana saya bisa mendapatkan lokasi sistem file dari skrip PowerShell? . Ini SANGAT umum.
PS Saya tidak berlangganan aturan 'semuanya modul'. Skrip saya digunakan oleh pengembang lain di luar GIT, jadi saya tidak suka meletakkan barang di tempat tertentu atau mengubah variabel lingkungan sistem sebelum skrip saya akan berjalan. Itu hanya sebuah skrip (atau dua, atau tiga).
sumber
Get-Command -Module FluentMigrator.PowerShell
cukup bagus?Anda tentu dapat mendefinisikan fungsi dalam file skrip (saya kemudian cenderung memuatnya melalui profil Powershell saya saat dimuat).
Pertama, Anda perlu memeriksa untuk memastikan fungsi dimuat dengan menjalankan:
Dan periksa apakah itu muncul dalam daftar (harus daftar 1!), Lalu beri tahu kami hasil yang Anda dapatkan!
sumber
Anda dapat menambahkan fungsi ke:
Sebuah fungsi akan tersedia.
sumber
Jika file Anda hanya memiliki satu fungsi utama yang ingin Anda panggil / paparkan, maka Anda juga dapat memulai file dengan:
Anda kemudian dapat menyebutnya misalnya sebagai berikut:
Ini membuatnya jauh lebih nyaman jika Anda ingin dengan mudah memanggil fungsi itu tanpa harus mengimpor fungsi.
sumber
[CmdletBinding()]
atribut dan memutakhirkannya secara gratis ke fungsi lanjutan. :-)Dengan asumsi Anda memiliki file modul bernama Dummy-Name.psm1 yang memiliki metode yang disebut Function-Dumb ()
sumber