
Estoy intentando escribir un script de Powershell que automatice la configuración de mi entorno de trabajo todos los días. Para hacer esto, tengo los siguientes dos scripts.
Establecer ventana.ps1
Function Set-Window {
<#
.LINK
https://superuser.com/questions/1324007/setting-window-size-and-position-in-powershell-5-and-6
#>
[cmdletbinding(DefaultParameterSetName='Name')]
Param (
[parameter(
Mandatory=$False,
ValueFromPipelineByPropertyName=$True,
ParameterSetName='Name'
)]
[string]$ProcessName='*',
[int]$X,
[int]$Y,
[int]$Width,
[int]$Height,
[switch]$HideWindow
)
Begin {
Try {
[void][Window]
} Catch {
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Window {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public extern static bool MoveWindow(
IntPtr handle, int x, int y, int width, int height, bool redraw);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public extern static bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
}
"@
}
}
Process {
If ($PSBoundParameters.ContainsKey('ProcessName')) {
$Processes = Get-Process -Name "$ProcessName"
} else {
throw 'No processes match criteria specified'
}
If ($PSBoundParameters.ContainsKey('HideWindow')) {
$Processes | ForEach-Object {
# 0 is the value that represents "hide".
# see https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/show-or-hide-windows
# for more details
[Window]::ShowWindowAsync($_.MainWindowHandle, 0)
}
} else {
$Processes | ForEach-Object {
[Window]::MoveWindow($_.MainWindowHandle, $X, $Y, $Width, $Height, $True)
}
}
}
}
Inicio-Trabajo.ps1
. C:\Users\<username>\Projects\Personal\PowerShell\Set-Window.ps1
# Start all necessary applications
Start-Process "C:\Users\<username>\AppData\Local\Programs\Microsoft VS Code\Code.exe" '--log=off'
Start-Process Chrome '--profile-directory="Profile 2"'
Start-Process "C:\Users\<username>\AppData\Roaming\Spotify\Spotify.exe"
Start-Process "C:\Users\<username>\AppData\Roaming\Zoom\bin\Zoom.exe"
Start-Process "C:\Users\<username>\AppData\Local\slack\slack.exe"
# Some applications can be moved right away, but still best to wait a bit
Start-Sleep -Seconds 1
Set-Window -ProcessName Spotify -X 400 -Y 0 -Height 600 -Width 1200
Set-Window -ProcessName Chrome -X 200 -Y 0 -Height 600 -Width 1200
Set-Window -ProcessName Slack -X 600 -Y 0 -Height 600 -Width 1200
# Others need a more time to load everything
Start-Sleep -Seconds 3
Set-Window -ProcessName Code -X 0 -Y 0 -Height 600 -Width 1200
Set-Window -ProcessName Zoom -HideWindow
Start-Sleep -Milliseconds 500
Exit
Para ejecutar estos scripts, creé un acceso directo con el objetivo establecido en C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy remotesigned -File C:\Users\<username>\Projects\Personal\PowerShell\Start-Work.ps1
y fijé ese acceso directo en mi barra de tareas. Cuando hago clic en el acceso directo, todo se ejecuta como se esperaba con una excepción: el programa PowerShell nunca se cierra. Según el resultado que ocasionalmente se escribe en la consola, supongo que esto se debe a VSCode. Pude demostrar esto ejecutando un .ps1
script simple que solo abre VS Code y puedo observar que abre una ventana de PowerShell. Sin embargo, esto no sucede si simplemente lo ejecuto Start-Process Code
desde una ventana abierta de PowerShell.
Entonces, dicho todo esto, ¿alguien sabe cómo puedo forzar el cierre de la ventana de PowerShell?
Respuesta1
Parece que VS Code podría mantener abierto el flujo de salida estándar. Tuve el mismo comportamiento que tú, pero pude cerrar PowerShell redirigiendo la salida a un archivo:
Start-Process "C:\Users\<username>\AppData\Local\Programs\Microsoft VS Code\Code.exe" '--log=off' `
-RedirectStandardOutput "C:\Users\<username>\AppData\Local\Programs\Microsoft VS Code\output.log"
exit
crea un archivo, pero el archivo está vacío; aunque nunca se escribió ningún resultado en la consola.