2012-02-01 13 views
5

Soy nuevo en powershell y estaba tratando de usar el script de ejemplo publicado here (script itself) para calcular un archivo hash. Puedo conseguir que funcione usando la notación puntoCargar script de powershell para que se pueda llamar en cualquier momento

. 'E:\Tools\Power Shell Scripts\Get-FileHash.ps1' E:\testfile.bin 

sin embargo yo quiero ser capaz de utilizarlo como el autor hace y sólo tiene que escribir

Get-Filehash E:\testfile.bin 

He descubierto que puedo hacer

function Get-FileHash {. 'E:\Tools\Power Shell Scripts\Get-FileHash.ps1'} 

pero eso no se comporta correctamente, me pide el archivo cuando lo hago Get-Filehash E:\testfile.bin

¿Qué debo poner en mi script de perfil para cargar correctamente este script y el Get-Help Get-FileHash funciona correctamente?

Respuesta

9

En realidad, la mejor práctica en esta situación es colocar la función en un módulo en lugar de en una secuencia de comandos . Tan ominoso como eso suena, todo lo que significa es renombrar el archivo que contiene desde una extensión .ps1 a una extensión .psm1 y luego almacenarlo en su directorio de Documentos (...\Documents\WindowsPowerShell\Modules\<Name>\<Name>.psm1) donde <Name> es el nombre base de su archivo.

A continuación, carga el módulo con este comando:

Import-Module Name 

Una vez cargado, puede llamar a las funciones contenidas dentro del módulo y Get-Help reconocerá los comandos también. Entre otras cosas, los módulos proporcionan encapsulamiento para que un archivo no contamine el espacio de contexto de otro. Y, por cierto, no es necesario escribir cmdlets en C#; también puede escribirlos en PowerShell. A modo de ejemplo, eche un vistazo a mi open-source PowerShell library que está escrito en PowerShell e incluye mucha ayuda reconocida por Get-Help.

Hay mucho más que saber para obtener el máximo beneficio de usar funciones y módulos. Lo remito a mi artículo Down the Rabbit Hole-A Study in PowerShell Pipelines, Functions, and Parameters en Simple-Talk.com.

+0

Gracias, ese método era exactamente lo que estaba buscando. ¿Tengo que colocar Import-Module en mi script de inicio o solo tengo que hacerlo una vez? –

+0

Depende :-) Normalmente debería estar en su inicio (es decir, su perfil) * a menos * que utilice un IDE que recuerde los módulos que cargó manualmente, como el IDE de PowerGUI. (Ese es el que yo uso y lo recomiendo ampliamente por sus capacidades de intellisense y depuración). –

+0

Gracias por la recomendación [PowerGUI] (http://powergui.org/index.jspa), solo estaba usando el ISE incorporado. –

5

Se podría hacer:

Set-Alias Get-Filehash "E:\Tools\Power Shell Scripts\Get-FileHash.ps1" 
+1

El alias funciona pero al hacer 'Get-Help Get-Filehash' no devuelve la ayuda detallada que obtendría si hiciera' Get-Help 'E: \ Tools \ Power Shell Scripts \ Get-Filehash.ps1 "' ¿Cómo puedo obtener la ayuda para que se comporte correctamente también? –

+0

Creo que tienes que escribirlo como CmdLet en ese caso, hay muchos ejemplos de esos en línea. –

+0

He buscado durante un tiempo, pero solo vi cómo se introducía el código C# en los ejemplos de un cmdlet; no pude encontrar un script para el ejemplo de cmdlet. –

4

poner el directorio en el que la secuencia de comandos se encuentra en su executable PATH (i.e. the PATH environment variable).

Por cierto, su función de contenedor trabajo en torno a que no funciona porque no está pasando el argumento de la secuencia de comandos:

function Get-FileHash {. 'E:\Tools\Power Shell Scripts\Get-FileHash.ps1' $args} 

o se puede crear un alias (como se sugiere en otras respuestas)

Cuestiones relacionadas