2009-06-18 15 views
44

(Nie mogę uwierzyć, że naprawdę o to pytam, ale mam niewyobrażalną siłę na cały dzień).Gdzie umieścić skrypty PowerShell?

Właśnie napisałem swój pierwszy poważny skrypt PowerShell i jestem z niego bardzo zadowolony. Mam zamiar używać go codziennie. Chcę móc wywołać go z poziomu linii poleceń Posh. Podam nazwę typu czasownik-rzeczownik, ale na razie jest to prosta .ps1, a nie jedna z tych zaawansowanych zaawansowanych funkcji, które pobierają parametry i takie.

Więc gdzie powinien iść i jak mogę go nazwać z poziomu linii poleceń? Planuję napisać więcej! Gdzie oni powinni pójść?

  • Czy powinien to być funkcja w moim profilu?
  • Czy powinienem iść na moją ścieżkę?
  • Czy przechodzi w PSMODULEPATH? Co tak właściwie tam się dzieje? Czy wygląda rekurencyjnie, czy jest to po prostu normalna ścieżka?

Gdzie wszyscy umieszczacie swoje skrypty PowerShell i jak je organizujecie? Mam duże doświadczenie w tworzeniu narzędzi C# i C++ i wiem, jak je nazwać i gdzie je umieścić. I na drugim końcu zrobiłem wiele bzdurnych plików .bat, które zwykle są samodzielne lub ułożone w stos w jakimś folderze. Ale PowerShell wydaje się być zupełnie inny. Możesz bardzo szybko tworzyć rzeczy typu crt .bat lub budować z niego biblioteki i zaawansowane usługi.

Naprawdę podoba mi się kilka pomysłów na to, jak zacząć organizować te rzeczy, zanim zacznę. Oczywiście każdy jest inny, więc mam nadzieję na jakąś dyskusję. Dzięki!

Odpowiedz

23

Umieściłem moje osobiste skrypty w tym samym folderze co mój profil. Mogę następnie utworzyć kopię zapasową wersji &. Mój profil zaczyna się od:

$ProfileRoot = (Split-Path -Parent $MyInvocation.MyCommand.Path) 
$env:path += ";$ProfileRoot" 
+1

użyj $ script: MyInvocation.MyCommand.Path, zobacz [ścieżka źródłowa skryptu wykonawczego] (http://stackoverflow.com/questions/801967/how-can-i-find-the-source-path-of -an-executing-script/6985381 # 6985381). Pojawiają się problemy z zagnieżdżonymi wywołującymi, nawet ze skryptem profilu, na przykład mam funkcję pomocniczą do ponownego załadowania twojego profilu (po edycji funkcji/zmiennej), ale pomijam wszystkie jednorazowe init (jak ładowanie zespołów .NET). – yzorg

8

Moje rekomendacje: - Zapisz skrypt w katalogu, jak chcesz, np. c: \ posh - Dodaj katalog do $ env: path

$env:path += ";c:\posh" 

Gwarantuje to, że może być w innym katalogu, powiedzmy C: \ Windows, ale można zadzwonić skrypt

[c:\windows] > sampl[TAB] # it expands the name of file to sample.ps1, then hit enter 

Jeśli sample.ps1 plik zawiera definicje funkcji i importowania go za każdym razem, to chciałbym rozważyć dodanie tej linii do $ profile pliku

. c:\posh\sample.ps1 

dotyczące organizacji skryptu .. po prostu se kilka katalogów zgodnie z przeznaczeniem skryptów :) Osobiste, dev, zewnętrzne (pobrane), sample, ...

12

Za pomocą V2 można utworzyć katalog modułów w katalogu WindowsPowerShell, w którym znajduje się profil użytkownika. PS automatycznie poszuka w tym katalogu, aby załadować moduły po uruchomieniu modułu importu. Stworzyłem także katalog "Scripts" w WindowsPowerShell, który jest katalogiem rodzeństwa dla modułów.

używam mój profil ustawić kilka katalogów za pomocą zmiennych za pomocą następującego kodu:

PS> cat $Profile 
$scripts = "$(split-path $profile)\Scripts" 
$modules = "$(split-path $profile)\Modules" 
$docs = $(resolve-path "$Env:userprofile\documents") 
$desktop = $(resolve-path "$Env:userprofile\desktop") 

PS> cat variable:\scripts 
C:\Users\andy.schneider\Documents\WindowsPowerShell\Scripts 

PS> cat variable:\modules 
C:\Users\andy.schneider\Documents\WindowsPowerShell\Modules 
+0

To też robię. Chociaż mam również katalog "Biblioteki" ze skryptami, które wykonuje moje auto z profilu, aby zdefiniować funkcje globalne. Zrobiłem to w PowerShell v1, prawdopodobnie w końcu zastąpię to modułami. – JasonMArcher

7

To co mam zrobić:

uwaga: „substytut” modulename czegoś sensownego.

Utwórz moduł i zapisz go w folderze modułów globalnych jako "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Moduły \ NazwaModułu \ NazwaModułu.psm1". np:

function global:FancyFunction() { 
    # do something interesting here. 
} 

Export-ModuleMember -function FancyFunction 

Otwórz swój profil PowerShell, a następnie dodaj następującą linię, aby upewnić się, że moduł jest ładowany przy każdym uruchomieniu sesji powershell:

Import-Module ModuleName -Force 

Można easiliy znaleźć swój profil powershell wpisując :

notepad $profile 

po otwarciu nowej sesji PowerShell powinieneś być w stanie połączyć się z funkcji z konsoli lub z innych skryptów, bez konieczności wykonywania EL cokolwiek mi.

Powiązane problemy