2009-06-18 3 views
44

(Non riesco a credere che lo stia chiedendo, ma sono fuori di testa per il giorno.)Dove mettere gli script di PowerShell?

Ho appena scritto il mio primo script di PowerShell serio, e sono davvero contento. Ho intenzione di usarlo ogni giorno o così. Voglio potere chiamarlo dalla linea di comando Posh. Gli darò un nome di tipo nome-verbo, ma per ora è un semplice .ps1 e non una di quelle fantasiose funzioni avanzate che prendono parametri e così via.

Quindi dove dovrebbe andare e come si chiama da una linea di comando Posh? Ho in programma di scrivere di più! Dove dovrebbero andare?

  • Dovrebbe essere una funzione nel mio profilo?
  • Dovrebbe andare sul mio percorso?
  • Va in un PSMODULEPATH? Che tipo di cose ci vanno comunque? Sembra ricorsivo o è proprio come il normale PERCORSO?

Dove mettete tutti gli script di PowerShell e come li organizzate? Ho molta esperienza nel creare strumenti C# e C++ e so come chiamarli e dove metterli. E all'estremo opposto ho fatto un sacco di file pappy .bat che di solito sono standalone o ammucchiati in un mucchio in qualche cartella. Ma PowerShell sembra essere molto diverso. Puoi fare in modo che le cose del tipo .bat crappy siano molto veloci, oppure puoi creare librerie e servizi sofisticati con esso.

Mi piacerebbe davvero qualche idea su come dovrei iniziare a organizzare queste cose prima di iniziare. Ovviamente tutti sono diversi, quindi spero in qualche discussione. Grazie!

risposta

23

Ho messo i miei script personali nella stessa cartella del mio profilo. Posso quindi eseguire il backup della versione & insieme. Il mio profilo inizia con:

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

utilizzare $ script: MyInvocation.MyCommand.Path, vedere [percorso di origine di uno script di esecuzione] (http://stackoverflow.com/questions/801967/how-can-i-find-the-source-path-of -un-esecuzione-script/6985381 # 6985381). Ci sono problemi con i chiamanti nidificati, anche con lo script del profilo, ad esempio ho una funzione di supporto per ricaricare il tuo profilo (dopo le modifiche di funzione/variabile) ma salta tutti gli init di una volta (come il caricamento degli assembly .NET). – yzorg

8

I miei consigli: - Memorizza lo script in una directory come desideri, ad es. c: \ posh - Aggiungere la directory a $ ENV: percorso

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

Questo assicura che si può essere in un'altra directory, diciamo c: \ windows, ma è possibile chiamare lo script

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

Se il file contiene Sample.ps1 funzioni definizioni si importa ogni volta, quindi vorrei prendere in considerazione l'aggiunta di questa riga al file di profilo $

. c:\posh\sample.ps1 

per quanto riguarda l'organizzazione di script .. solo se dirs verali secondo lo scopo degli script :) Personale, dev, esterno (scaricato), campioni, ...

12

Con V2, è possibile creare una directory moduli nella directory WindowsPowerShell in cui il vostro profilo è. PS eseguirà automaticamente l'accesso a tale directory per caricare i moduli quando si esegue l'importazione-modulo. Ho creato una directory "Scripts" in WindowsPowerShell e anche una directory di moduli di pari livello.

Io uso il mio profilo per impostare alcune directory utilizzando le variabili con il seguente codice:

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

Questo è quello che faccio pure io. Anche se ho anche una directory "Librerie" con script che il mio profilo esegue automaticamente per definire le funzioni globali. L'ho fatto in PowerShell v1, probabilmente sostituirò tutto ciò con i moduli alla fine. – JasonMArcher

7

Questo è quello che faccio:

nota: substitute "ModuleName" per qualcosa di significativo.

Creare un modulo e salvarlo nella cartella dei moduli globali come "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ ModuleName \ ModuleName.psm1". ad esempio:

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

Export-ModuleMember -function FancyFunction 

Aprite il vostro profilo PowerShell e aggiungere la seguente riga per assicurarsi che il modulo viene caricato automaticamente ogni volta che si avvia una sessione di PowerShell:

Import-Module ModuleName -Force 

Potete easiliy trovare il tuo profilo PowerShell digitando :

notepad $profile 

Quando si apre una nuova sessione di PowerShell, si dovrebbe essere in grado di chiamare la funzione dalla console o da altri script senza dover fare nulla els e.