2008-11-11 11 views
13

Me encuentro escribiendo un montón de funciones relacionadas que tratan con diferentes nombres (clústeres, servidores sql, servidores en general, archivos, etc.) y pongo cada uno de estos grupos de funciones en archivos separados (diga cluster_utils.ps1, por ejemplo). Quiero poder "importar" algunas de estas bibliotecas en mi perfil y otras en mi sesión de PowerShell si las necesito. He escrito 2 funciones que parecen resolver el problema, pero dado que solo he estado usando PowerShell durante un mes, pensé que podría preguntar si había alguna secuencia de comandos de "mejores prácticas" que pudiera usar en su lugar.Importación de "bibliotecas" en powershell

Para utilizar estas funciones, lo DOT-fuente de ellas (en mi perfil o de sesión) ... por ejemplo,

# to load c:\powershellscripts\cluster_utils.ps1 if it isn't already loaded 
. require cluster_utils  

Estas son las funciones:

$global:[email protected]{} 
function require([string]$filename){ 
     if (!$loaded_scripts[$filename]){ 
      . c:\powershellscripts\$filename.ps1 
      $loaded_scripts[$filename]=get-date 
    } 
} 

function reload($filename){ 
    . c:\powershellscripts\$filename.ps1 
    $loaded_scripts[$filename]=get-date 
} 

Cualquier comentario ser útil.

+0

Es posible que desee agregarlos a PoshCode.org (un repositorio de scripts de comunidad) –

+0

No he estado en ese sitio. Gracias. –

+0

Estoy de acuerdo con Steven ... Una gran idea, me alegro de que la estés compartiendo. Ya hice lo de romper en sustantivos, y básicamente hago ls lib * | % {. $ _} en este momento sin importar si algo está cargado o no. – halr9000

Respuesta

5

Sobre la base de Steven's answer, otra mejora podría ser permitir cargar varios archivos a la vez:

$global:scriptdirectory = 'C:\powershellscripts' 
$global:loaded_scripts = @{} 

function require { 
    param(
    [string[]]$filenames=$(throw 'Please specify scripts to load'), 
    [string]$path=$scriptdirectory 
) 

    $unloadedFilenames = $filenames | where { -not $loaded_scripts[$_] } 
    reload $unloadedFilenames $path 
} 

function reload { 
    param(
    [string[]]$filenames=$(throw 'Please specify scripts to reload'), 
    [string]$path=$scriptdirectory 
) 

    foreach($filename in $filenames) { 
    . (Join-Path $path $filename) 
    $loaded_scripts[$filename] = Get-Date 
    } 
} 
3

Mike, creo que esos guiones son increíbles. Parceling sus funciones en bibliotecas es muy útil, pero creo que sus funciones para cargar secuencias de comandos es muy conveniente.

El único cambio que haría sería convertir también la ubicación del archivo en un parámetro. Puede establecer un valor predeterminado o incluso usar una variable global para eso. No necesita agregar el ".ps1"

$global:scriptdirectory= 'c:\powershellscripts' 
$global:[email protected]{} 
function require(){ 
     param ([string]$filename, [string]$path=$scriptdirectory) 
     if (!$loaded_scripts[$filename]){ 
      . (Join-Path $path $filename) 
      $loaded_scripts[$filename]=get-date 
    } 
} 

function reload(){ 
    param ([string]$filename, [string]$path=$scriptdirectory) 
    . (Join-Path $path $filename) 
    $loaded_scripts[$filename]=get-date 
} 

Nice functions!

1

Creo que se encontrará la funcionalidad "módulos" de PowerShell v2 a ser muy satisfactorio. Básicamente se encarga de esto por ti.

+1

Mi impresión es que encontraré gran parte de la funcionalidad de v2 para ser muy satisfactoria. Sin embargo, dado que la fecha de lanzamiento está muy lejos, me estoy quedando lejos de instalarlo. Estoy intentando implementar las buenas ideas en v1 cada vez que puedo. –

Cuestiones relacionadas