Administrar funciones de PowerShell
La mayoría de ustedes probablemente sepan que he estado usando PowerShell desde sus días beta, lo que ahora significa que tengo aproximadamente 10 años de archivos de PowerShell. Me resulta difícil tirar algo. Durante este período de tiempo, mis scripts de perfil de PowerShell también crecieron, y a menudo cargaron funciones que se me ocurrieron. El efecto ha sido que se tarda un poco más en abrir una nueva consola PowerShell o sesión ISE. Como en el fondo sé que hay funciones que ya no uso, pensé que era hora de limpiar un poco el perfil. El primer paso fue identificar mis funciones.
Primero, ¿de cuántas funciones estoy hablando? PowerShell almacena las funciones activas y definidas actualmente en un PSDrive, lo que significa que es bastante fácil obtener una lista de "directorio" y contarlas.
Sin embargo, algunas de esas funciones están definidas por Microsoft y otros módulos.
No tengo ningún problema con las funciones definidas a partir de una fuente determinada. Mi problema está en esos 100 que no tienen fuente. Nuevamente, algunos de ellos están definidos por Microsoft y están bien. Entonces miré uno de ellos con más detalle.
Noté que estas funciones incluían un archivo de ayuda. Sabía que ninguna de mis funciones no lo hacía. Con esta información puedo obtener un listado de directorio y filtrar con Where-Object.
dir function: | where {(-Not $_.Source) -AND ($_.HelpFile -notmatch "System\.Management")}Estas son funciones que se cargan desde un punto que obtiene un archivo ps1. Por cierto, la lista tenía 62 elementos.
Como alternativa, podría usar Get-Command, que eliminaría los filtros.
get-command -CommandType function | where {(-Not $_.Source) -AND ($_.HelpFile -notmatch "System\.Management")}Sepa que esto buscará funciones en módulos que no están cargados actualmente, por lo que tardará un poco más en ejecutarse. Esto me dio 61 artículos.
Pero ahora al menos puedo revisar la lista e identificar funciones que no he usado en años o que ahora están obsoletas. Desafortunadamente, no hay forma de saber desde la función PSDrive o con Get-Command de dónde proviene la función. Afortunadamente, guardo todos mis archivos en una sola unidad y lo más probable es que la función se defina en un script .ps1. Puedo usar Select-String para encontrarlo.
En mi lista hay una función llamada Show-Balloon que probablemente no he usado en años. ¿En qué archivo está?
dir c:\scripts\*.ps1 | select-string "\bshow-balloon\b" -ListEstoy envolviendo el nombre de la función en un límite de palabra de expresión regular para no obtener una coincidencia en algo como show-balloontip. El parámetro -List me da la primera coincidencia, que es todo lo que realmente necesito.
Como escribo todas mis funciones con el mismo formato, podría haber buscado así y obtener el mismo resultado.
dir c:\scripts\*.ps1 | select-string "\bFunction show-balloon\b" -ListLa salida de Select-String es un objeto que incluye una propiedad para el nombre del archivo o la ruta.
Ahora puedo juntarlo todo.
$scripts = dir c:\scripts\*.ps1
dir function: |
where {(-Not $_.Source) -AND ($_.HelpFile -notmatch "System\.Management")} |
Select Name,@{Name = "Source";Expression = { ($scripts | select-string "\b$($_.name)\b" -list).Path}}No quiero tener que volver a enumerar todos los archivos de script para cada función, así que lo obtendré una vez y luego usaré esa variable en la expresión Seleccionar-Objeto.
Con esta información puedo modificar mis perfiles de PowerShell y eliminar las líneas que cargan las funciones que no quiero o editar el archivo fuente para comentar la función si hubiera algo más en el mismo archivo que quisiera conservar. Cualquier función en esta lista sin una fuente coincidente probablemente esté definida directamente en el script del perfil o requerirá una búsqueda manual.
Ahora es el momento de hacer un poco de limpieza, aunque me encantaría saber cómo mantienes las cosas ordenadas en tu mundo PowerShell.