- Test-Connection ofrece ping, traceroute, MTU y pruebas TCP con salida estructurada.
- En PowerShell 6/7 cambia sintaxis, tipos devueltos y añade parámetros como -Traceroute y -Detailed.
- Windows PowerShell 5.1 usa WMI y Win32_PingStatus con opciones de autenticación y suplantación.
- -Quiet devuelve booleanos, -Repeat itera continuo y -MtuSize calcula el Path MTU.
Si trabajas con redes en Windows, Linux o macOS, tarde o temprano vas a querer comprobar si un host responde y cómo de saludable es el trayecto. El cmdlet Test-Connection es la navaja suiza moderna para pings ICMP, traceroute, detección de MTU y pruebas TCP desde PowerShell, con salida estructurada que se puede filtrar y procesar.
Además, la historia del cmdlet tiene dos caras: en Windows PowerShell clásico (5.1) se apoyaba en WMI y devolvía Win32_PingStatus, mientras que en PowerShell 6 y posteriores el cmdlet se rediseñó y amplió para ser multiplataforma y exponer objetos específicos como PingStatus, TraceStatus o TcpPortStatus. Conocer ambas familias de parámetros y salidas te permite diagnosticar a fondo y con precisión.
Qué es Test-Connection y qué resuelve
Test-Connection envía solicitudes de eco ICMP (ping) a uno o varios destinos y devuelve las respuestas; también puede trazar la ruta (traceroute), calcular el Path MTU y probar si un puerto TCP está accesible. Frente al ejecutable ping de toda la vida, el cmdlet retorna objetos ricos que puedes canalizar, filtrar y convertir a informes o dashboards.
En su versión moderna, el cmdlet añade parámetros como -Traceroute, -MtuSize, -TcpPort, -Repeat, -TimeoutSeconds, -IPv4/-IPv6 y -Detailed (este último a partir de PowerShell 7.4 para desglosar los intentos TCP). Con -Quiet puedes limitar la salida a booleanos por destino para decisiones rápidas en scripts.
En entornos donde antes combinabas ping, tracert, nslookup o telnet, PowerShell aporta opciones nativas para cubrir prácticamente todo el diagnóstico de conectividad desde una sola herramienta. Y si prefieres otra aproximación, existe Test-NetConnection para chequeos combinados de red, pero este artículo se centra en exprimir Test-Connection.
Cambios clave: Windows PowerShell 5.1 vs PowerShell 6/7
Hay dos etapas claras en la evolución del cmdlet. En Windows PowerShell 5.1 y anteriores el cmdlet usa WMI y devuelve Win32_PingStatus; expone parámetros como -ComputerName, -AsJob, -DcomAuthentication, -Impersonation, -Protocol, -ThrottleLimit, -TimeToLive (TTL) y -WsmanAuthentication, entre otros.
Con el salto a PowerShell 6+, el cmdlet se reescribió para ser multiplataforma y su API cambió: ahora se utiliza -TargetName (en vez de -ComputerName), aparecen los conjuntos de parámetros Ping/Repeat/Traceroute/MtuSize/TcpPort, las salidas son tipos específicos como PingStatus, TraceStatus, PingMtuStatus o TcpPortStatus, y llegan -TimeoutSeconds, -ResolveDestination y -Detailed (7.4) para TCP.
Esto implica que, si escribes scripts portables, debes detectar la versión y ajustar parámetros y procesamiento de salida. Una opción es cubrir ambos mundos con ramas condicionales ($PSVersionTable.PSVersion.Major).
Sintaxis y conjuntos de parámetros modernos (PowerShell 6+)
El cmdlet ofrece varios conjuntos de parámetros que activan modos distintos. Aquí tienes la panorámica con sus opciones principales:
- Default Ping: Test-Connection <string[]>
- Repeat Ping: Test-Connection <string[]> -Repeat
- Traceroute: Test-Connection <string[]> -Traceroute
- MtuSizeDetect: Test-Connection <string[]> -MtuSize
- TcpPort: Test-Connection <string[]> -TcpPort <int>
En todos los modos, -TargetName es obligatorio y acepta nombres DNS o direcciones IPv4/IPv6. La salida por defecto en ping es una secuencia de objetos PingStatus, uno por eco.
Sintaxis clásica (Windows PowerShell 5.1)
En entornos Windows PowerShell 5.1 se usan otras firmas, con -ComputerName como parámetro central y varias opciones de autenticación WMI:
- Default: Test-Connection <string[]>
- Source: Test-Connection <string[]> <string[]>
- Quiet: Test-Connection <string[]>
En este caso, la salida por defecto es ManagementObject Win32_PingStatus, y con -AsJob se devuelve un objeto de trabajo (System.Management.Automation.RemotingJob).
Parámetros modernos, explicados uno a uno
-TargetName <string[]>: destinos a probar, admite nombres y direcciones IPv4/IPv6; posición 0 y obligatorio; acepta canalización por valor y por nombre de propiedad.
-Ping: fuerza el modo ping ICMP; es el comportamiento por defecto, por lo que suele omitirse salvo combinaciones específicas.
-Repeat: envía pings de forma continua; si proporcionas varios destinos, solo repite sobre el primero y omite el resto; incompatible con -Count en ping.
-Traceroute: traza la ruta hasta el destino devolviendo objetos TraceStatus por salto; desde PowerShell 6 y compatible con -ResolveDestination para nombres DNS intermedios.
-MtuSize: detecta el Path MTU al destino, retornando PingMtuStatus con el tamaño de MTU efectivo; útil combinado con -DontFragment y -BufferSize.
-TcpPort <int>: intenta abrir una conexión TCP al puerto especificado en el destino; devuelve $true o $false (y con -Detailed en 7.4, objetos TcpPortStatus con latencias e información por intento).
-Count <int>: número de eco solicitudes; por defecto 4 en ping y válido también con TcpPort.
-Delay <int>: segundos entre intentos; útil para congestión o pruebas sostenidas.
-BufferSize <int>: bytes de carga útil; 32 por defecto; ajusta junto a -DontFragment para pruebas de MTU.
-DontFragment: establece el flag de no fragmentación en IP; clave para Path MTU Discovery.
-IPv4 / -IPv6: obligan al protocolo IP que se usará; útiles en hosts dual-stack o cuando hay problemas de resolución.
-MaxHops <int>: máximo de saltos permitidos; 128 por defecto en Windows 10+.
-ResolveDestination: intenta resolver el nombre DNS de destino y, junto a -Traceroute, también los hosts intermedios si es posible.
-Source <string>: origen de envío (equipo) cuando procede; por defecto el local, útil en escenarios multi-origen.
-Quiet: suprime errores y devuelve booleanos por destino; $true si al menos un ping llega, $false si todos fallan.
-TimeoutSeconds <int>: tiempo máximo de espera por respuesta; 5 segundos por defecto; disponible desde PowerShell 6.
-Detailed: en pruebas TCP (-TcpPort), devuelve TcpPortStatus con Id, dirección, latencia, Connected y Status; incorporado en PowerShell 7.4.
Parámetros y opciones clásicas (Windows PowerShell 5.1)
-ComputerName <string[]>: destinos a testear; obligatorio y no depende de PowerShell remoting.
-AsJob: ejecuta el cmdlet en segundo plano; devuelve un objeto de trabajo recuperable con Receive-Job para no bloquear la sesión.
-DcomAuthentication <AuthenticationLevel>: nivel de autenticación COM usado con WMI; valores aceptados Default, None, Connect, Call, Packet, PacketIntegrity, PacketPrivacy, Unchanged (por defecto Packet).
-Impersonation <ImpersonationLevel>: nivel de suplantación WMI; valores Default, Anonymous, Identify, Impersonate, Delegate (por defecto Impersonate).
-Protocol <string>: protocolo para WMI; DCOM o WSMan según configuración.
-WsmanAuthentication <string>: mecanismo de autenticación cuando se usa WSMan; admite Default, Basic, Negotiate, CredSSP, Digest, Kerberos.
-ThrottleLimit <int>: máximo de conexiones simultáneas para el comando; por defecto 32.
-TimeToLive (TTL) <int>: número máximo de reenvíos antes de descartar el paquete; 128 por defecto en Windows (alias TTL).
-Source <string[]> y -Credential <PSCredential>: para enviar pings desde otros orígenes con credenciales adecuadas, especialmente útil para comparar latencia desde diferentes ubicaciones.
Ejemplos prácticos con PowerShell 6/7
Ping básico IPv4 a un servidor concreto y análisis de la salida PingStatus:
Test-Connection -TargetName Server01 -IPv4
Ping a múltiples destinos en un solo comando con matriz de nombres:
Test-Connection -TargetName Server01, Server02, Server12
Personalizar count, delay, hops y tamaño de búfer cuando la red está cargada:
Test-Connection -TargetName Server01 -Count 3 -Delay 2 -MaxHops 255 -BufferSize 256
Ejecutar como trabajo en segundo plano leyendo destinos de un archivo y esperando resultados:
$job = Start-Job -ScriptBlock { Test-Connection -TargetName (Get-Content -Path 'Servers.txt') }
$results = Receive-Job $job -Wait
Crear una PSSession solo si hay conectividad al menos en un eco:
if (Test-Connection -TargetName Server01 -Quiet) {
New-PSSession -ComputerName Server01
}
Descubrir la ruta con traceroute y devolver TraceStatus por salto:
Test-Connection -TargetName www.google.com -Traceroute
Prueba TCP detallada (PowerShell 7.4) para un puerto TLS típico:
Test-Connection bing.com -TcpPort 443 -Detailed -Count 4
Ejemplos prácticos con Windows PowerShell 5.1
Ping sencillo a un equipo remoto con salida Win32_PingStatus:
Test-Connection -ComputerName Server01
Ping a varios servidores desde el equipo local:
Test-Connection -ComputerName Server01, Server02, Server12
Ping a un destino desde varios orígenes con credenciales para comparar latencias:
Test-Connection -Source Server02, Server12, localhost -ComputerName Server01 -Credential (Get-Credential)
Personalizar intentos, TTL, búfer y concurrencia en redes extensas:
Test-Connection -ComputerName Server01 -Count 3 -Delay 2 -TTL 255 -BufferSize 256 -ThrottleLimit 32
Ejecutar como trabajo en segundo plano y recoger resultados cuando termine:
$job = Test-Connection -ComputerName (Get-Content 'Servers.txt') -AsJob
if ($job.JobStateInfo.State -ne 'Running') {
$results = Receive-Job $job
}
Ping con credenciales y suplantación ajustando el nivel de impersonation:
Test-Connection Server55 -Credential (Get-Credential) -Impersonation Identify
Usar salida booleana para decisiones rápidas en scripts:
if (Test-Connection -ComputerName Server01 -Quiet) { New-PSSession Server01 }
Entradas y salidas del cmdlet
Entradas: en la versión moderna, no se canalizan objetos directamente al cmdlet; se aceptan valores por parámetro estándar (TargetName admite canalización por valor o por nombre de propiedad).
Salidas en PowerShell 6/7:
- Microsoft.PowerShell.Commands.TestConnectionCommand+PingStatus: un objeto por cada respuesta ICMP.
- Microsoft.PowerShell.Commands.TestConnectionCommand+TraceStatus: un objeto por salto con -Traceroute.
- Microsoft.PowerShell.Commands.TestConnectionCommand+PingMtuStatus: con -MtuSize para Path MTU.
- Boolean: con -Quiet o -TcpPort (matrices si hay múltiples destinos).
- Microsoft.PowerShell.Commands.TestConnectionCommand+TcpPortStatus: con -Detailed para TCP en 7.4.
Salidas en Windows PowerShell 5.1:
- ManagementObject (Win32_PingStatus): por cada eco.
- Boolean: cuando se usa -Quiet.
- System.Management.Automation.RemotingJob: si se ejecuta con -AsJob.
Notas y particularidades multiplataforma
Linux y permisos: al usar -BufferSize distinto de 32 o combinaciones con -MtuSize que cambian el tamaño por defecto, puede requerirse sudo. En ese caso, el cmdlet lanza una excepción indicando que se necesitan privilegios.
Quiet y manejo de errores: -Quiet devuelve booleanos y suprime errores; recuerda que con varios destinos la salida es una matriz de valores en orden de evaluación.
Repeat vs Count: no mezcles -Repeat con -Count en ping; -Repeat ignora destinos adicionales y solo itera sobre el primero. Para múltiples destinos con repetición, invoca el cmdlet por cada uno.
Resolver nombres: -ResolveDestination añade resolución DNS del destino y, con -Traceroute, intenta resolver cada salto; útil para mapear dispositivos intermedios.
Compatibilidad: si tu script debe funcionar en Windows PowerShell 5.1 y PowerShell 6/7, detecta la versión y usa -ComputerName o -TargetName según corresponda, y ajusta la interpretación de la salida.
Test-Connection y su relación con Test-NetConnection
Antes de Test-NetConnection, se combinaban utilidades como ping, tracert, nslookup o telnet para diagnosticar conectividad. Con PowerShell v4 llegó Test-NetConnection, que centraliza pruebas ICMP y TCP e incluso traza rutas con un solo cmdlet.
Aun así, Test-Connection cubre escenarios profundos con objetos más específicos para ICMP, MTU, traceroute y pruebas TCP modernas. Puedes complementarlo con Test-NetConnection cuando necesites un chequeo rápido todo-en-uno.
Ejemplos de Test-NetConnection para comparar comportamientos:
# Chequeo general con más detalle
Test-NetConnection -InformationLevel Detailed
# Comprobar resolución y ruta hacia un host
Test-NetConnection -ComputerName google.com
Test-NetConnection -ComputerName google.com -TraceRoute
# Verificar un puerto TCP conocido
Test-NetConnection -ComputerName google.com -CommonTCPPort HTTP
# Especificar un puerto concreto
Test-NetConnection -ComputerName google.com -Port 80
En escenarios donde telnet ya no está presente por defecto, estos cmdlets de PowerShell simplifican la verificación de puertos TCP y conectividad ICMP, añadiendo metadatos útiles como interfaz de salida o dirección de origen.
Redactor apasionado del mundo de los bytes y la tecnología en general. Me encanta compartir mis conocimientos a través de la escritura, y eso es lo que haré en este blog, mostrarte todo lo más interesante sobre gadgets, software, hardware, tendencias tecnológicas, y más. Mi objetivo es ayudarte a navegar por el mundo digital de forma sencilla y entretenida.