Entrega de herramientas controladas por versión con PowerShell
El IDE de interfaz de usuario de PowerShell más popular es PowerShell Studio de Sapien, que permite crear fácilmente aplicaciones WinForms. Al empaquetar código de PowerShell en un archivo .exe, puede especificar el número de versión y aumentarlo con cada nueva versión. Si crea archivos ejecutables basados en PowerShell con este método, surge la pregunta de cómo debe entregar las herramientas. La siguiente solución funciona para este escenario o cualquier situación para entregar archivos según la versión o incluso una carpeta de archivos.
Al entregar herramientas, querrá asegurarse de que se esté utilizando la última versión y es posible que también requiera que la herramienta se inicie desde el escritorio para evitar bloqueos de archivos o enlaces WAN lentos. Este problema me surgió cuando los usuarios ejecutaban mis herramientas desde un archivo compartido. El archivo a menudo se bloqueaba y no podía actualizarlo, y la velocidad de la red hasta nuestras ubicaciones remotas provocaba un gran retraso en el inicio del archivo. Pude abordar ambos problemas con la siguiente solución.
Paso #1: Lo primero que debemos hacer es configurar algunas variables. Esto no es necesario, pero es mucho más fácil de aplicar en múltiples herramientas. Lo que estamos configurando aquí es la ubicación de origen de la herramienta y dónde se instalará/copiará. En este caso, guardaremos la herramienta en C:\Users\YourUserName\AppData\Roaming\YourToolName. AppData es una buena ubicación ya que se puede escribir en ella sin ser administrador de la estación de trabajo.
$appfolderpath = $env:appdata.ToString() + "\YourToolName"
$app = $appfolderpath + "\YourToolExecutable.exe"
Paso #2: Ahora expandiremos nuestras variables para incluir la versión actual de la aplicación y la ruta del archivo.
$appfolderpath = $env:appdata.ToString() + "\YourToolName"
$app = $appfolderpath + "\YourToolExecutable.exe"
$currentversion = "1.0.1"
$sourceapppath = "\\Server\Share\YourApplication\" + $currentversion + "\YourToolExecutable.exe"
Paso #3: Como prefiero dejar mi script de PowerShell estático, utilizo el siguiente método para recuperar la versión actual de un archivo de texto llamado currentversion.txt ubicado en la ruta de la aplicación de origen. El contenido del archivo de texto será simplemente el número de versión, que en este caso es 1.0.1.
$appfolderpath = $env:appdata.ToString() + "\YourToolName"
$app = $appfolderpath + "\YourToolExecutable.exe"
$currentversion = Get-Content "\\Server\Share\YourApplication\currentversion.txt"
$sourceapppath = "\\Server\Share\YourApplication\" + $currentversion + "\YourToolExecutable.exe"
Paso #4: En este punto necesitamos agregar la lógica que creará la carpeta local y copiará la herramienta si no existe.
$appfolderpath = $env:appdata.ToString() + "\YourToolName"
$app = $appfolderpath + "\YourToolExecutable.exe"
$currentversion = Get-Content "\\Server\Share\YourApplication\currentversion.txt"
$sourceapppath = "\\Server\Share\YourApplication\" + $currentversion + "\YourToolExecutable.exe"
if ((Test-Path -Path $appfolderpath) -eq $false) { New-Item -path $env:appdata.ToString() -Name "YourToolName" -Type directory }
if ((Test-Path -Path $app) -eq $false) { Copy-Item $sourceapppath -Destination $appfolderpath }
Paso #5: Si la herramienta ya existe localmente, debemos verificar la versión del archivo para ver si es necesario actualizarlo.
$appfolderpath = $env:appdata.ToString() + "\YourToolName"
$app = $appfolderpath + "\YourToolExecutable.exe"
$currentversion = Get-Content "\\Server\Share\YourApplication\currentversion.txt"
$sourceapppath = "\\Server\Share\YourApplication\" + $currentversion + "\YourToolExecutable.exe"
if ((Test-Path -Path $appfolderpath) -eq $false) { New-Item -path $env:appdata.ToString() -Name "YourToolName" -Type directory }
if ((Test-Path -Path $app) -eq $false) { Copy-Item $sourceapppath -Destination $appfolderpath }
else { if ([System.Diagnostics.FileVersionInfo]::GetVersionInfo($app).FileVersion -ne $currentversion) { Copy-Item $sourceapppath -Destination $appfolderpath } }
Paso #6: La última parte de PowerShell es ejecutar la aplicación con Invoke-Item.
$appfolderpath = $env:appdata.ToString() + "\YourToolName"
$app = $appfolderpath + "\YourToolExecutable.exe"
$currentversion = Get-Content "\\Server\Share\YourApplication\currentversion.txt"
$sourceapppath = "\\Server\Share\YourApplication\" + $currentversion + "\YourToolExecutable.exe"
if ((Test-Path -Path $appfolderpath) -eq $false) { New-Item -path $env:appdata.ToString() -Name "YourToolName" -Type directory }
if ((Test-Path -Path $app) -eq $false) { Copy-Item $sourceapppath -Destination $appfolderpath }
else { if ([System.Diagnostics.FileVersionInfo]::GetVersionInfo($app).FileVersion -ne $currentversion) { Copy-Item $sourceapppath -Destination $appfolderpath } }
Invoke-Item $app
Paso 7: Ahora que hemos creado el script requerido en el Paso 6, podemos guardar el archivo en nuestro recurso compartido de archivos como \\Server\Share\YourApplication\YourTool.ps1. Examinemos todos los archivos que necesitamos para implementar esta solución.
1) \\Servidor\Compartir\SuAplicación\SuHerramienta.ps1 - Script del Paso #6
2) \\Server\Share\YourApplication\currentversion.txt: archivo de texto que contiene el número de versión actual
3) \\Server\Share\YourApplication\currentversion\YourToolExecutable.exe: su archivo .exe actual ubicado en un archivo compartido
Por ejemplo, para actualizar su herramienta a una nueva versión, simplemente necesitará actualizar \\Server\Share\YourApplication\currentversion.txt de 1.0.1 a 1.0.2 y colocar su versión 1.0.2 de YourToolExecutable.exe en \\ Servidor\Compartir\SuAplicación\1.0.2\.
Paso #8: Ahora simplemente necesitamos implementar un acceso directo en las estaciones de trabajo del usuario para iniciar la herramienta. Una política de grupo, un script de inicio de sesión, un paquete msi o incluso PowerShell pueden lograr esto. El siguiente ejemplo creará un acceso directo en el menú Inicio del usuario que iniciará el archivo PowerShell. El script de PowerShell comprueba si la herramienta existe, copia la última versión si es necesario y la inicia localmente.
$Shell = New-Object -ComObject ("WScript.Shell")
$ShortCut = $Shell.CreateShortcut($env:USERPROFILE + "\Start Menu\Programs\YourTool.lnk")
$ShortCut.TargetPath="powershell.exe"
$ShortCut.Arguments="-ExecutionPolicy Bypass -File \\Server\Share\YourApplication\YourTool.ps1"
$ShortCut.Save()
Eso es todo lo que necesita y espero que ayude a otros miembros de la comunidad que deseen mejorar su entorno actual. La creación de archivos de acceso directo (.lnk) merece una publicación propia y la cubriré en un artículo futuro.