Algunos ejemplos de código que parece correcto... pero que seguro que fallará en alguna situación. PowerShell NO ES VBS !
Contesta honestamente. La idea de este test es que puedas conocer y evaluar tus propias dudas...
1. Esta función, ContarProcesos, cuenta los
procesos en ejecución que tienen un nombre determinado. "CMD", por
ejemplo.
Function ContarProcesos ([string]$Name)
{
return (Get-Process -Name $Name).Count
}
Funciona ? | ![]() ![]() ![]() |
Es una buena idea escribir así la función ? |
![]() ![]() |
Respuesta : |
En PowerShell 2 esto fallará en muchas ocasiones. En v3 funciona, pero con un coste de rendimiento y claridad. La sintaxis está mal.
|
2. Estas 2 líneas de código buscan un nombre
concreto de dominio ("domain.com") en el fichero Netlogon.Log
$File = Get-Content NETLOGON.LOG
$File | Select-String "domain.com"
Funciona ? | ![]() ![]() ![]() |
Pista | ¿ Qué sucede si el fichero tiene 1 TB de tamaño ? |
Respuesta : |
Está MAL por su sintaxis. Devolverá a veces resultados erróneos. Mete en el fichero el dominio, por ejemplo, DomainSCOM.NET y también lo encontrará. Además, si el fichero es grande, nos dejará sin memoria. Hay mejores maneras !
|
3. Esta función (ExisteUsuario) usa .Count para decidir si un usuario concreto existe en AD o no.
Function ExisteUsuario ($Name)
{
return ((Get-AdUser -Identity $Name).Count -eq 1)
}
Funciona ? | ![]() ![]() ![]() |
Independientemente de la versión de PowerShell, fallará. ¿ Por qué ? |
|
Respuesta : |
Pruébalo... esto no funciona así, ni siquiera con V4. La propiedad .Count es el diablo ! La sintaxis es incorrecta.
|
4. Esta sencilla función
(FicherosLOG) debe mostrar todos los ficheros *.LOG que haya en el
directorio de Windows.
Function FicherosLog
{
Get-ChildItem -Include *.LOG -Path $env:windir
}
Funciona ? | ![]() ![]() ![]() |
Independientemente de la versión de PowerShell, fallará. ¿ Por qué ? |
|
Respuesta : |
Pruébalo... esto no funciona así.
|
5. Esta función devuelve los servicios definidos, ordenados por Status.
Pero nos importa el orden...
Queremos ver primero los "Stopped" y luego los "Running", así que al Sort-Object le forzamos que sea -DESCENDING
Function MostrarServicios
{
Get-Service | Sort-Object -Property Status -Descending
}
Funciona ? | ![]() ![]() ![]() |
Curiosamente, el orden es el inverso al deseado. Tenemos primero los "Running", y luego los "Stopped". -Descending debería mostrar primero los Stopped. ¿ Por qué ? |
|
Respuesta : | TBD |
6. Puedo definir variables con estos nombres ?
$Cañón = 3
$Esta Variable Tiene Espacios = 5
Funciona ? | ![]() ![]() ![]() |
Respuesta : |
La primera es... correcta. La variable con espacios es correcta, pero requiere algo más de sintaxis...... |
7. Puedo poner esta línea en mi profile ?
$x = 1..10000000
Funciona ? | ![]() ![]() ![]() |
Respuesta : |
Poder poder... lo que se dice poder.... claro que se puede. Ahora bien... cuánta memoria necesitaré en mi sesión ? |
8. Estoy haciendo un bucle para cada mes del año... y en España (y
en cualquier otro idioma) ...
... me sale que hay 13 meses en el año !!! ¿ 13 ??? Por qué ?
$Region = "es-ES"
$Meses = [globalization.cultureinfo]::CreateSpecificCulture($Region).DateTimeFormat.MonthNames
foreach ($Mes in $Meses) { Write-Host $Mes } # Línea extra !
$Meses.Count # 13
Funciona ? | ![]() ![]() ![]() |
Respuesta : |
Este bucle está mal. No podemos usar los meses al año así porque Windows define 13...
Sí, 13 (y no es un error). En el caso de Write-Host obtenemos una línea extra vacía, algo que puede no ser muy grave... Pero en un bucle de verdad, procesando ficheros por ejemplo, nos volveremos locos con el nombre del mes treceavo... |
(TBD - Añadiendo más ejemplos en breve)