Principales respuestas
Listar propiedades de carpeta servidores remotos.

Pregunta
-
Hola, les consulto si me pueden facilitar un script que me permita listar las propiedades de una carpeta , de varios servidores remotos, y tomar el nombre de estos equipos de un archivo txt.
Por ejemplo:
Servidor01 - Carpeta -> c:\vm
Servidor02 - Carpeta -> c:\vm
..................
Servidorxx - Carpeta -> c:\vm
Y el resultado debería, reflejar alga asi.
Gracias.
Saludos Jorge Argentina
- Editado Cavallin Jorge domingo, 12 de julio de 2015 12:05
Respuestas
-
Hola de nuevo,
Eso es que sale algún tamaño tan grande que supera el valor máximo permitido por una variable de tipo entero.
Cambia donde pone:
Param ([int]$size)
Por:
Param ([long]$size)
En la función Format-FileSize.
Si aún así no te funcionara, entonces lo que hacemos es quitar la función que únicamente es para dar los valores de tamaño "bonitos" y dejamos el código en:
Clear-Host #Fichero con nombres de servidores. Un nombre por línea. Ej: #Servidor1 #Servidor2 $Servidores = Get-Content "C:\Temp\SERVIDORES.txt" #Nombre de la carpeta a leer en cada servidor $Carpeta = "C:\Temp" try { foreach ($srv in $Servidores) { $Ruta = ("\\" + $srv + "\" + $Carpeta).replace(":","$") if (Test-Path $Ruta) { $Objetos = Get-ChildItem $Ruta -Recurse | Select-Object -Property * $NumFicheros = ($Objetos | Where { ! $_.PSIsContainer }).Count $TamañoFicheros = ($Objetos | Measure-Object -Property Length -Sum).sum $NumCarpetas = ($Objetos | Where { $_.PSIsContainer }).Count Write-Host ($srv + "($carpeta): " + $NumFicheros + " ficheros. " + $TamañoFicheros + "bytes - " + $NumCarpetas + " carpetas") } else { Write-Warning ("En el servidor $srv no existe la ruta $Carpeta o no dispones de permisos de acceso.") } } } catch { Write-Error $_ }
A ver si ahora lo conseguimos.
Un saludo.
Diego
- Marcado como respuesta Cavallin Jorge miércoles, 15 de julio de 2015 12:33
-
Hola, Diego. Acá dejo tu mismo código con una modificación para grabar el archivo de texto de salida. Comente la parte de calculo , para que el tamaño me salga en bytes , pero es solo un detalle de gusto, en el formato de salida.
Clear-Host
$Servidores = hostname
#archivo de salida
$File = "e:\sizefolder.txt"
#Nombre de la carpeta a leer en cada servidor
$Carpeta = "e:\temp\"
#Reregistro en al archivo
Function Format-FileSize() {
#Param ([int]$size)
Param ([long]$size)
# If ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)}
# ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)}
# ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)}
# ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)}
If ($size -gt 0) {[string]::Format("{0:0.00} Bytes", $size)}
Else {""}
}
try
{
foreach ($srv in $Servidores)
{
$Ruta = ("\\" + $srv + "\" + $Carpeta).replace(":","$")
if (Test-Path $Ruta)
{
$Objetos = Get-ChildItem $Ruta -Recurse | Select-Object -Property *
$NumFicheros = ($Objetos | Where { ! $_.PSIsContainer }).Count
$TamañoFicheros = ($Objetos | Measure-Object -Property Length -Sum).sum
$MbFicheros = Format-FileSize($TamañoFicheros)
$NumCarpetas = ($Objetos | Where { $_.PSIsContainer }).Count
Write-Host ($srv + "($carpeta) " + $NumFicheros + " ficheros " + $NumCarpetas + " carpetas " + " Size " + $MbFicheros |Out-File $File)
}
else
{
Write-Warning ("En el servidor $srv no existe la ruta $Carpeta o no dispones de permisos de acceso.")
}
}
}
catch
{
Write-Error $_
}Saludos Jorge Argentina
- Marcado como respuesta Cavallin Jorge miércoles, 5 de octubre de 2016 14:28
Todas las respuestas
-
Hola,
Prueba a ver si te sirve algo como esto:
Clear-Host #Fichero con nombres de servidores. Un nombre por línea. Ej: #Servidor1 #Servidor2 $Servidores = Get-Content "C:\Temp\SERVIDORES.txt" #Nombre de la carpeta a leer en cada servidor $Carpeta = "C:\Temp" Function Format-FileSize() { Param ([int]$size) If ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)} ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)} ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)} ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)} ElseIf ($size -gt 0) {[string]::Format("{0:0.00} B", $size)} Else {""} } try { foreach ($srv in $Servidores) { $Ruta = ("\\" + $srv + "\" + $Carpeta).replace(":","$") if (Test-Path $Ruta) { $Objetos = Get-ChildItem $Ruta -Recurse | Select-Object -Property * $NumFicheros = ($Objetos | Where { ! $_.PSIsContainer }).Count $TamañoFicheros = ($Objetos | Measure-Object -Property Length -Sum).sum $MbFicheros = Format-FileSize($TamañoFicheros) $NumCarpetas = ($Objetos | Where { $_.PSIsContainer }).Count Write-Host ($srv + "($carpeta): " + $NumFicheros + " ficheros. " + $MbFicheros + " - " + $NumCarpetas + " carpetas") } else { Write-Warning ("En el servidor $srv no existe la ruta $Carpeta o no dispones de permisos de acceso.") } } } catch { Write-Error $_ }
Ten en cuenta que necesita permisos de acceso a \\nombreservidor\C$ para poder llegar a las carpetas remotas.
La información se está escribiendo por pantalla, pero la podrías volcar a fichero de texto, etc. sin problema.
En realidad, varias de las líneas que se ejecutan podrían agruparse en una sola con pipes (|), pero te lo he puesto así para que veas más cláramente lo que hace. Igualmente, la función Format-FileSize está para darte el tamaño en B, Mb, Gb, etc según su valor.
Espero que te sirva.
Un saludo.
Diego
-
Se ve que algún error se genero.
E:\carpetas.ps1 : Cannot process argument transformation on parameter 'size'. Cannot convert value "2663544454" to type "System.Int32". Error:
"Value was either too large or too small for an Int32."
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,carpetas.ps1
Gracias
Saludos Jorge Argentina
-
Hola de nuevo,
Eso es que sale algún tamaño tan grande que supera el valor máximo permitido por una variable de tipo entero.
Cambia donde pone:
Param ([int]$size)
Por:
Param ([long]$size)
En la función Format-FileSize.
Si aún así no te funcionara, entonces lo que hacemos es quitar la función que únicamente es para dar los valores de tamaño "bonitos" y dejamos el código en:
Clear-Host #Fichero con nombres de servidores. Un nombre por línea. Ej: #Servidor1 #Servidor2 $Servidores = Get-Content "C:\Temp\SERVIDORES.txt" #Nombre de la carpeta a leer en cada servidor $Carpeta = "C:\Temp" try { foreach ($srv in $Servidores) { $Ruta = ("\\" + $srv + "\" + $Carpeta).replace(":","$") if (Test-Path $Ruta) { $Objetos = Get-ChildItem $Ruta -Recurse | Select-Object -Property * $NumFicheros = ($Objetos | Where { ! $_.PSIsContainer }).Count $TamañoFicheros = ($Objetos | Measure-Object -Property Length -Sum).sum $NumCarpetas = ($Objetos | Where { $_.PSIsContainer }).Count Write-Host ($srv + "($carpeta): " + $NumFicheros + " ficheros. " + $TamañoFicheros + "bytes - " + $NumCarpetas + " carpetas") } else { Write-Warning ("En el servidor $srv no existe la ruta $Carpeta o no dispones de permisos de acceso.") } } } catch { Write-Error $_ }
A ver si ahora lo conseguimos.
Un saludo.
Diego
- Marcado como respuesta Cavallin Jorge miércoles, 15 de julio de 2015 12:33
-
-
Hola Diego. Si me lo permites cambiaría un poco lo que me propones que es excelente. El tema es que esto al consultar en forma remota a varios equipos , el resultado se demora en función de los objetos que tiene la carpeta que medimos.
Te consulto si usando esta misma lógica de calculo, en lugar de leer remoto , seria hacerlo en forma local, generar un archivo que luego se copie en otro equipo remoto.
y luego los concateno : Get-Content *.txt | set-Content 3.csv
Muchas gracias
Saludos Jorge Argentina
-
Hola, Diego. Acá dejo tu mismo código con una modificación para grabar el archivo de texto de salida. Comente la parte de calculo , para que el tamaño me salga en bytes , pero es solo un detalle de gusto, en el formato de salida.
Clear-Host
$Servidores = hostname
#archivo de salida
$File = "e:\sizefolder.txt"
#Nombre de la carpeta a leer en cada servidor
$Carpeta = "e:\temp\"
#Reregistro en al archivo
Function Format-FileSize() {
#Param ([int]$size)
Param ([long]$size)
# If ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)}
# ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)}
# ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)}
# ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)}
If ($size -gt 0) {[string]::Format("{0:0.00} Bytes", $size)}
Else {""}
}
try
{
foreach ($srv in $Servidores)
{
$Ruta = ("\\" + $srv + "\" + $Carpeta).replace(":","$")
if (Test-Path $Ruta)
{
$Objetos = Get-ChildItem $Ruta -Recurse | Select-Object -Property *
$NumFicheros = ($Objetos | Where { ! $_.PSIsContainer }).Count
$TamañoFicheros = ($Objetos | Measure-Object -Property Length -Sum).sum
$MbFicheros = Format-FileSize($TamañoFicheros)
$NumCarpetas = ($Objetos | Where { $_.PSIsContainer }).Count
Write-Host ($srv + "($carpeta) " + $NumFicheros + " ficheros " + $NumCarpetas + " carpetas " + " Size " + $MbFicheros |Out-File $File)
}
else
{
Write-Warning ("En el servidor $srv no existe la ruta $Carpeta o no dispones de permisos de acceso.")
}
}
}
catch
{
Write-Error $_
}Saludos Jorge Argentina
- Marcado como respuesta Cavallin Jorge miércoles, 5 de octubre de 2016 14:28