none
Liberar memoria para evitar el outofmemory RRS feed

Respuestas

Todas las respuestas

  • Que en un script te aparezca un OutOfMemory, en el 99,99 % de los casos es debido a un error en la programación ¿Puedes poner el script para que le echemos un vistazo?

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    jueves, 15 de abril de 2010 7:52
    Moderador
  • $ex='ex'
    $log='.log'
    $servidoractual= 'nurnen'
                $dia= get-childitem\\servidor\Logs\$servidoractual -name
                $count= $dia.count
                for ($j=0;$j -le $count-1; $j++){
                    $diaactual=$dia[$j .. $j]
                    $filedate= get-date -uformat "%y%m%d"
                    $archivodehoy= $ex+$filedate+$log
                    if ($diaactual -eq $archivodehoy){
                        move-item\\servidor\Logs\$servidoractual\$diaactual\\servidor\Copia\$servidoractual\$diaactual
                    } else {
                        $a= get-content\\servidor\Logs\$servidoractual\$diaactual
                        $counta = $a.count
                        $counta1 = $counta/150000
                        $counta1 = "{0:N0}" -f $counta1
                        for ($s=0; $s -le $counta1; $s++){
                            for ($z=0; $z -le $counta; $z++){
                                $a[$z .. ($z+149999)] | out-file\\servidor\partit$s.log
                                $z=$z+149999
                                get-content\\servidor\partit$s.log | findstr /v "#" | out-file\\servidor\nuevo.log
                                #conectem amb la base de dades
                                $Server = 'ring'
                          $sqlcon = New-Object System.Data.SqlClient.SqlConnection
                          $sqlcon.ConnectionString = "Data Source=$server;Integrated Security=True"
                          $sqlcon.open()
                          $sqlcmd = New-Object Data.SqlClient.SqlCommand
                          $sqlcmd = $sqlcon.CreateCommand()
                          $sqlcmd.Connection = $sqlcon
                                $sqlcmd.CommandText = "use PerformanceStats BULK INSERT Stats FROM '\\ring\e$\nuevo.log' WITH (FIELDTERMINATOR= ' ', ROWTERMINATOR = '\n' );"
                                $sqlcmd.ExecuteNonQuery()
                                remove-item\\servidor\nuevo.log
                        }

                    }
                  }

     }
     

    jueves, 15 de abril de 2010 8:41
  • He hecho algunas modificaciones y te hago en los comentarios preguntas de cosas raras que veo:

    $ex='ex'
    $log='.log'
    $servidoractual= 'nurnen'
    $dia= get-childitem \\servidor\Logs\$servidoractual -name
    $count= $dia.count
    for ($j=0;$j -le $count-1; $j++){
      $diaactual=$dia[$j]
      $filedate= get-date -uformat "%y%m%d"
      $archivodehoy= $ex + $filedate + $log
      if ($diaactual -eq $archivodehoy)
      {
        move-item \\servidor\Logs\$servidoractual\$diaactual \\servidor\Copia\$servidoractual\$diaactual
      }
      else
      {
        $a = get-content \\servidor\Logs\$servidoractual\$diaactual
        $counta = $a.count
        # He cambiado esta línea y borrado la siguiente, pues lo que hacías era dividir
        # y dar formato sin decimales; "{0:N0}" devuelve una cadena, no un número. Si quieres
        # hacer una división entera, debes usar el método Floor del objeto System.Math
        # http://technet.microsoft.com/en-us/library/ee176879.aspx
        # ¿Estamos seguros de que el fichero siempre tendrá 150000 o más líneas?
        $counta1 = [math]::floor([int] $counta / [int] 150000)
        
        for ($s=0; $s -le $counta1; $s++)
        {
          # No debes usar -le (menor o igual, pues la cuenta empieza en cero y termina uno
          # por debajo del valor devuelto por la propiedad Count. De no hacerlo así siempre
          # te añadirá una línea en blanco
          for ($z=0; $z -lt $counta; $z +=150000)
          {
            $a[$z .. ($z + 149999)] | out-file \\servidor\partit$s.log
            # He comendado el incremento de $z pues es más claro haciéndolo en el propio for
    #        $z=$z+149999
            # ¿Seguro que estas rutas están bien? Si te estás refiriendo a ficheros, debería
            # ser \\servidor\carpeta\fichero.log
            get-content \\servidor\partit$s.log | findstr /v "#" | out-file \\servidor\nuevo.log
            
            # ¿No sería más correcto que conectaras a la base de datos fuera del bucle y aquí
            # sólo ejecutases el INSERT?
            #conectem amb la base de dades
            $Server = 'ring'
            $sqlcon = New-Object System.Data.SqlClient.SqlConnection
            $sqlcon.ConnectionString = "Data Source=$server;Integrated Security=True"
            $sqlcon.open()
            $sqlcmd = New-Object Data.SqlClient.SqlCommand
            $sqlcmd = $sqlcon.CreateCommand()
            $sqlcmd.Connection = $sqlcon
            $sqlcmd.CommandText = "use PerformanceStats BULK INSERT Stats FROM '\\ring\e$\nuevo.log' WITH (FIELDTERMINATOR= ' ', ROWTERMINATOR = '\n' );"
            $sqlcmd.ExecuteNonQuery()
            # Vuelvo a preguntar lo de las rutas
            remove-item \\servidor\nuevo.log
          } # for $z
        } # for $s
      } # If $diaactual
     } # For $j
     
    

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    jueves, 15 de abril de 2010 9:52
    Moderador
  • Antes de todo gracias por ayudarme

     

    las rutas estan bien lo que he borrado parte de la ruta al colgarlo

    los archivos siempre tienen mas de 150000 pero si no fuera el caso no pasa nada, son archivos que la mayoria de dias tienen 150000 * 5

    jueves, 15 de abril de 2010 10:04
  • No el insert no lo puedo poner despues del insert porque quiero que esos valores que encuentra en el bucle los inserte
    jueves, 15 de abril de 2010 10:05
  • Respecto a lo de la conexión ¿lo podemos probar así?:

    $ex='ex'
    $log='.log'
    $servidoractual= 'nurnen'
    $dia= get-childitem \\servidor\Logs\$servidoractual -name
    $count= $dia.count
    
    #conectem amb la base de dades
    $Server = 'ring'
    $sqlcon = New-Object System.Data.SqlClient.SqlConnection
    $sqlcon.ConnectionString = "Data Source=$server;Integrated Security=True"
    $sqlcon.open()
    $sqlcmd = New-Object Data.SqlClient.SqlCommand
    $sqlcmd = $sqlcon.CreateCommand()
    $sqlcmd.Connection = $sqlcon
    
    for ($j=0;$j -le $count-1; $j++){
      $diaactual=$dia[$j]
      $filedate= get-date -uformat "%y%m%d"
      $archivodehoy= $ex + $filedate + $log
      if ($diaactual -eq $archivodehoy)
      {
        move-item \\servidor\Logs\$servidoractual\$diaactual \\servidor\Copia\$servidoractual\$diaactual
      }
      else
      {
        $a = get-content \\servidor\Logs\$servidoractual\$diaactual
        $counta = $a.count
        # He cambiado esta línea y borrado la siguiente, pues lo que hacías era dividir
        # y dar formato sin decimales; "{0:N0}" devuelve una cadena, no un número. Si quieres
        # hacer una división entera, debes usar el método Floor del objeto System.Math
        # http://technet.microsoft.com/en-us/library/ee176879.aspx
        # ¿Estamos seguros de que el fichero siempre tendrá 150000 o más líneas?
        $counta1 = [math]::floor([int] $counta / [int] 150000)
        
        for ($s=0; $s -le $counta1; $s++)
        {
          # No debes usar -le (menor o igual, pues la cuenta empieza en cero y termina uno
          # por debajo del valor devuelto por la propiedad Count. De no hacerlo así siempre
          # te añadirá una línea en blanco
          for ($z=0; $z -lt $counta; $z +=150000)
          {
            $a[$z .. ($z + 149999)] | out-file \\servidor\partit$s.log
            # He comendado el incremento de $z pues es más claro haciéndolo en el propio for
    #        $z=$z+149999
            # ¿Seguro que estas rutas están bien? Si te estás refiriendo a ficheros, debería
            # ser \\servidor\carpeta\fichero.log
            get-content \\servidor\partit$s.log | findstr /v "#" | out-file \\servidor\nuevo.log
            
            $sqlcmd.CommandText = "use PerformanceStats BULK INSERT Stats FROM '\\ring\e$\nuevo.log' WITH (FIELDTERMINATOR= ' ', ROWTERMINATOR = '\n' );"
            $sqlcmd.ExecuteNonQuery()
            # Vuelvo a preguntar lo de las rutas
            remove-item \\servidor\nuevo.log
          } # for $z
        } # for $s
      } # If $diaactual
     } # For $j
    # Cerramos la conexión a la base de datos
    $Sqlcon.Close

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    jueves, 15 de abril de 2010 10:10
    Moderador
  • el problema lo de en findstr.exe y aveces tambien en $a

    sabrias como liberar la variable $a para que no saliese otra vez el outofmemory

    viernes, 16 de abril de 2010 8:24
  • Respecto al findstr, la verdad no me había fijado demasiado en esa línea. Ya que llamas a ese ejecutable externo ¿Para qué usar Get-Content si él mismo ya puede acceder directamente al fichero? Yo esa línea la pondría así:

    findstr /v "#" \\servidor\partit$s.log | out-file \\servidor\nuevo.log

    Respecto a a$ ¿Qué tamaños pueden tener esos ficheros? Porque a ver si es que se pueden acabar comiendo la memoria


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    viernes, 16 de abril de 2010 10:04
    Moderador
  • llegan a tener entre 150 mb a 400 mb
    viernes, 16 de abril de 2010 10:06
  • es que no se si ay una manera mas facil de no utilzar tantas variables q es lo q me hace que salte el error al final e modificado algo mas y me a quedado asi

    $ex='ex'
    $log='.log'
    $servidoractual= 'nurnen'
                $dia= get-childitem\\ring\e$\Logs\$servidoractual -name
                $count= $dia.count
                for ($j=0;$j -le $count-1; $j++){
                    $diaactual=$dia[$j .. $j]
                    $filedate= get-date -uformat "%y%m%d"
                    $archivodehoy= $ex+$filedate+$log
                    if ($diaactual -eq $archivodehoy){
                        move-item\\ring\e$\Logs\$servidoractual\$diaactual\\ring\e$\Copia\$servidoractual\$diaactual
                    } else {
                        $b=0
                        Clear-Variable b
                        $b= get-content\\ring\e$\Logs\$servidoractual\$diaactual
                        $a= (get-content\\ring\e$\Logs\$servidoractual\$diaactual | Measure-Object -line)
                        $counta = $a.Lines
                        $counta1 = [math]::floor([int] $counta / [int] 150000)
                        for ($s=0; $s -le $counta1; $s++){
                            for ($z=0; $z -lt $counta; $z++){
                                $b[$z .. ($z+149999)] | out-file\\ring\e$\partit$s.log
                                $z=$z+149999
                                findstr /v "#"\\ring\e$\partit$s.log | | out-file \\ring\e$\nuevo.log
                                $Server = 'ring'
                          $sqlcon = New-Object System.Data.SqlClient.SqlConnection
                          $sqlcon.ConnectionString = "Data Source=$server;Integrated Security=True"
                          $sqlcon.open()
                          $sqlcmd = New-Object Data.SqlClient.SqlCommand
                          $sqlcmd = $sqlcon.CreateCommand()
                          $sqlcmd.Connection = $sqlcon
                                $sqlcmd.CommandText = "use PerformanceStats BULK INSERT Stats FROM '\\ring\e$\nuevo.log' WITH (FIELDTERMINATOR= ' ', ROWTERMINATOR = '\n' );"
                                $sqlcmd.ExecuteNonQuery()
                                remove-item\\ring\e$\nuevo.log
                        }

                    }
                  }

     }

    viernes, 16 de abril de 2010 10:10
  • Ya que no quieres quitar la creación objeto conexión y el objeto comando del bucle, con lo que los estás creando en cada vuelta, al menos podrías cerrar la coexión al finalizar el insert con $sqlcon.Close().

    No sé porqué te has complicado la vida con $b y $a. Almacenas en $b lo que antes almacenabas en $a y utilizas $a para obtener el mismisimo dato que te podría dar $b (obtienes lo mismo con $b.Count que con $a.Lines).

    Podemos también suprimir la variable $counta, pues "$counta1 = [math]::floor([int] $b.Count / [int] 150000)" te dará el valor buscado.

    Vuelvo a decirte que no deberías incrementar el valor del bucle for de $z en la línea "$z=$z + 149999", pues en la declaración del bucle pones como incremento "$z++"; el resultado es el mismo que si directamente en la declaración del bucle for pones de incremento "$z +=150000", ya que tu incrementas con la línea que pones 149999 y al empezar una nueva vuelta se produce, al poner $z++, un incremento de uno, con lo que el incremento de cada vuelta es de 150000. Por tanto, si suprimes la línea "$z=$z + 149999" y sustituyes la declaración del bucle de " for ($z=0; $z -lt $counta; $z++)" a "for ($z=0; $z -lt $counta; $z += 15000)" obtendrás el mismo resultado, el código te quedará más claro y sólo se hara una operación de suma para el incremento de cada vuelta, en lugar de dos operaciones de suma.

    La variable $Server ¿para qué la declaras? Sólo es usada para recibir el valor (siempre el mismo) y utilizarlo a continuación; podría ponerse directamente "Data Source=ring"

    También sobran $ex y $log, pues dado el uso que haces de ellas bastaría con no las declarases y a cambio pusieras la línea donde son usadas así:

    $archivodehoy= "ex$filedate`.log"

    Otra cosa que funciona, sí, pero no es necesaria ni correcta es "$diaactual=$dia[$j .. $j]", basta con que sea "$diaactual=$dia[$j]" pues así especificas un elemento (el que necesitas obtener) de un array y de la otra manera especificas un rango de elementos del array que empieza en un número y acaba en el mismo número ¡es decir, sólo eliges un elemento! ($a[1] = $a[1..1]).

    Yo además probaría otra cosa: En lugar de hacerlo todo en un bucle, yo primero trocearía el archivo en varios archivos y con esos trozos harçia los inserts, aunque implique un nuevo bucle recorriendo los ficheros.

     


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    viernes, 16 de abril de 2010 10:38
    Moderador
  • pero es que intentado hacer ese escrip que me parte cada archivo pero no se muy bien como hacerlo si me pudieras dar una idea plis porque yo hago algo asi


    $servidors= get-content \\ring\e$\Logs\servidors1.txt
    $count1=$servidors.count
    For ($d=0;$d –le $count1-1; $d++){
                $servidoractual= $servidors[$d .. $d]
                $dia= get-childitem\\ring\e$\Logs\$servidoractual -name
                $count= $dia.count
                for ($j=0;$j -le $count-1; $j++){
                    $diaactual=$dia[$j]

                    $filedate= get-date -uformat "%y%m%d"
                    $archivodehoy= 'ex$filedate.log'
                    if ($diaactual -eq $archivodehoy){
                        move-item\\ring\e$\Logs\$servidoractual\$diaactual\\ring\e$\Copia\$servidoractual\$diaactual
                    } else {
                        $a= get-content\\ring\e$\Logs\$servidoractual\$diaactual
                        $counta = $a.count

                        $counta1 = [math]::floor([int] $counta / [int] 150000)
                        for ($s=0; $s -le $counta1; $s++){
                            for ($z=0; $z -le $counta; $z +=150000){
                                $a[$z .. ($z+149999)] | out-file\\ring\e$\$servidoractual\partit$s.log
                                $z=$z+149999
                        }

                    }
                  }

     }
     }

    viernes, 16 de abril de 2010 10:54
  • A ver así:

    # Obtenemos la lista de equipos contenida en el fichero
    # \\ring\e$\Logs\servidors1.txt
    $servidors= get-content \\ring\e$\Logs\servidors1.txt
    
    # Recorremos la lista de servidores
    ForEach ($Servidor In $Servidors)
    {
      # Obtenemos la lista de ficheros de Logs del servidor
      $dias= get-childitem \\ring\e$\Logs\$Servidor -name
    
      # Recorremos la lista de Logs
      ForEach ($Dia In $Dias)
      {
    
        # Obtenemos la fecha de hoy en formato yymmdd
        $filedate= get-date -uformat "%y%m%d"
    
        # Obtenemos el nombre correspondiente al Log de hoy
        $archivodehoy= "ex$filedate`.log"
    
        # Si corresponde el fichero con el nombre obtenido lo moveremos
        # a la carpeta de copia
        If ($Dia -eq $archivodehoy)
        {
          move-item "\\ring\e$\Logs\$Servidor\$Dia" "\\ring\e$\Copia\$Servidor\$Dia"
        } 
        # Si no coincide el nombre del fichero con el obtenido...
        else
        {
          # Cargamos en $a el contenido del fichero
          $a= get-content "\\ring\e$\Logs\$servidor\$Dia"
    
          # Obtenemos la división entera del total de líneas del fichero
          # y 150000, pues lo dividiremos en ficheros de 150000 líneas
          $counta1 = [math]::floor([int] $a.count / [int] 150000)
    
          For ($s=0; $s -le $counta1; $s++)
          {
    
            # Obtenemos el indice de la primera línea del fichero del trozo actual
            $Inicio = $s * 150000
    
            # Obtenemos la última línea
            $Fin = $Inicio + 149999
    
            # Si la última línea es superior al total de la cuenta menos 1, es que es
            # el último trozo, y su fin está en el total de la cuenta menos 1
            If(($Fin - 1) -gt $a.Count){$Fin = $a.Count - 1}
    
            # Volcamos el trozo en el fichero correspondiente
            $a[$Inicio..$Fin] | Out-File "\\ring\e$\$Servidor\partit$("{0:D4}" -f $s).log"
    
          } # For $s
        } # If $Dia
      } # ForEach $Dia
    } # ForEach $Servidor
    
    

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    viernes, 16 de abril de 2010 12:17
    Moderador
  • Ahora, que yo me jugaría el huevo derecho y la yema del izquierdo a que el problema de falta de memoria es debido a que no cierras lass conexiones a la base de datos.

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    viernes, 16 de abril de 2010 12:20
    Moderador
  • Muchas Gracias Fernanado me has salvado de una :D

    El lunes lo acabo de provar cierro conexiones y te digo si peta :D

     

    En serio muchas gracias

    viernes, 16 de abril de 2010 13:45
  • Fernando aun no lo he provado pero creo q no me ira del todo bien ya que siempre falla por outofmemory $a=get-content....
    lunes, 19 de abril de 2010 7:45
  • ¿Pero qué es lo que no has probado, el script de trocear que he puesto o el que tú retoques para que ya haga los insert y por tanto el que he puesto sí que falla en esa línea? Si falla, es porque los ficheros son demasiado grandes; en ese caso deberías probar con una herramienta de terceros, dado que entonces PowerShell y Get-Content no te valen.
    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 8:25
    Moderador
  • ahora lo estoy provando cual seria esta herramienta de terceros???
    lunes, 19 de abril de 2010 8:32
  • Este parece que hace lo que necesitas:

    Text File Splitter
    http://www.systemwidgets.com/Downloads/FreewareDownloads/TextFileSplitter/tabid/120/Default.aspx


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 8:52
    Moderador
  • mira me ha salido este error :(

     

    Program 'findstr.exe' failed to execute: Exception of type 'System.OutOfMemoryException' was thrown.
    At \\ring\e$\Scripts\insertar a partir de carpetas problematicos.ps1:53 char:83
    +         get-content \\ring\e$\Logs\$Servidor\partit$("{0:D4}" -f $s).log | findstr <<<<  /v "#" | out-file \\ring\e$\nuevo.log.

    lunes, 19 de abril de 2010 9:08
  • ¿No habíamos quedado en que no era necesario llamar a get-content para encaminar a findstr?:

    findstr /v "#" \\ring\e$\Logs\$Servidor\partit$("{0:D4}" -f $s).log | out-file \\ring\e$\nuevo.log

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 9:14
    Moderador
  • cierto lo hize sin el get-content pero me hace algo raro como ponerme espacios en sitios que no quiero como por exemplo

    si el texto es "hola que tal"
    la linea me hace

    "h o l a q u e t a l"

    lunes, 19 de abril de 2010 9:17
  • ¡Caray, qué trabado todo! :-) El archivo está en Unicode y findstr no soporta unicode. Prueba a utilizar en su lugar FIND.EXE que tiene la misma nomenclatura y sí soporta Unicode. Es decir, cambia la línea a:

    find /v "#" \\ring\e$\Logs\$Servidor\partit$("{0:D4}" -f $s).log | out-file \\ring\e$\nuevo.log


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 9:27
    Moderador
  • find.exe : FIND: Parameter format not correct
    At \\ring\e$\Scripts\insertar a partir de enlazador 3.0.ps1:22 char:25
    +                     find <<<<  /v "#" \\ring\e$\Logs\$servidoractual\$diaactual  | out-file \\ring\e$\nuevo.log
        + CategoryInfo          : NotSpecified: (FIND: Parameter format not correct:String) [], RemoteException
        + FullyQualifiedErrorId : NativeCommandError
    lunes, 19 de abril de 2010 9:56
  • find.exe : FIND: Parameter format not correct
    At \\ring\e$\Scripts\insertar a partir de enlazador 3.0.ps1:22 char:25
    +                     find <<<<  /v "#" \\ring\e$\Logs\$servidoractual\$diaactual  | out-file \\ring\e$\nuevo.log
        + CategoryInfo          : NotSpecified: (FIND: Parameter format not correct:String) [], RemoteException
        + FullyQualifiedErrorId : NativeCommandError
    lunes, 19 de abril de 2010 9:56
  • No lo entiendo, debería funcionar sin dar ese error. Prueba a ejecutar FIND desde el propio powershell contra uno de esos archivos a ver qué pasa.

    Otra cosa, cuando pongas código no lo hagas directamente en el teto del mensaje, si no pulsando en el botón que es un formulario de windows con los caracteres "</>" (el primero por la derecha en la parte superior del editor del mensaje). De esa manera podremos ver "de verdad" lo que hay en e l código, pues si pegas directamente en el mensaje puede falsearse el contenido.


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 10:08
    Moderador
  • me sigue diciendo
    > find /v # \\ring\e$\Logs\belegaer\ex100409.log
    FIND: Parameter format not correct
    lunes, 19 de abril de 2010 10:14
  • La almohadilla debe estar encerrada entre comillas dobles:

    find /v "#" \\ring\e$\Logs\belegaer\ex100409.log

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 10:17
    Moderador
  • sigue dando el mismo error de todos modos :( es como si no lo reconociera

    lunes, 19 de abril de 2010 10:21
  • ¿Pero de forma interactiva te da el mismo error, no desde el script?


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 10:33
    Moderador
  • de las dos maneras me da error
    lunes, 19 de abril de 2010 10:34
  • creo que me da error porque \v no existe para find

    find [-H] [-L] [-P] [path...] [expression]

    lunes, 19 de abril de 2010 10:36
  • ¿Qué versión SO es la que tienes? Pon la salida de "FIND /?"

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 10:41
    Moderador
  • tengo windows xp professional

    al poner la salida me sale toda la ayuda correctamente :S es muy raro que no me la acepte luego

    lunes, 19 de abril de 2010 10:48
  • Lo dicho, que qué trabado todo :-)

     

    Prueba find con un archivo pequeño. Para que sea en unicode, guarda como unicode ese archivo. Quiero probar si es que da ese error pero lo que en realidad sucede es que es un fichero demasiado grande para FIND. También me gustaría probar si desde CMD se comporta igual que desde PowerShell.


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    lunes, 19 de abril de 2010 10:58
    Moderador
  • mira que pasa

    PS C:\> get-content 'C:\Documents and Settings\user\My Documents\Feina\hola.t xt' 
    #hola 
    que 
    tal 
    #be 
    tu 
    be 
    PS C:\> find /v "#" 'C:\Documents and Settings\user\My Documents\Feina\hola.t xt' File not found - #
    martes, 20 de abril de 2010 7:33
  • Lo dicho, que qué trabado todo :-P

    Resulta que al invocar FIND.EXE desde PowerShell, PowerShell "enreda" a FIND dándole significado a las comillas dobles, por lo que la forma de invocar a FIND es quitando ese significado con acento grave:

    PS C:\> find /v `"#`" `"C:\Documents and Settings\user\My Documents\Feina\hola.txt`"

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    martes, 20 de abril de 2010 8:38
    Moderador
  • asi funciona bien en modo terminal a modo scrip no acaba de ir muy bien :(
    martes, 20 de abril de 2010 8:53
  • ¿Qué quieres decir con modo script? ¿Funciona ese find desde línea de comandos sin problemas con uno de esos "ficheritos" que nos traemos entre manos?
    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    martes, 20 de abril de 2010 9:06
    Moderador
  • lo he provado asi solo poniendo la linea pero al poner con mas lienas falla
    martes, 20 de abril de 2010 9:09
  • ¿Podemos recapitular y me pones el script en qué estado está? Y dime cuál es el fallo que te da (lástima que no tenga yo uno de esos "ficheritos" para poder probar :-(
    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    martes, 20 de abril de 2010 9:13
    Moderador
  • aver tengo esto

    no exo lo de las conexiones mas arriba porque asi tengo mas conciencia de donde empiezo ha insertar y tal es mas por mi comodidad :D

     

    # Obtenemos la lista de equipos contenida en el fichero
    # \\ring\e$\Logs\servidors1.txt
    $servidors= get-content \\ring\e$\Logs\servidors1.txt
    
    # Recorremos la lista de servidores
    ForEach ($Servidor In $Servidors)
    {
     # Obtenemos la lista de ficheros de Logs del servidor
     $dias= get-childitem \\ring\e$\Logs\$Servidor -name
    
     # Recorremos la lista de Logs
     ForEach ($Dia In $Dias)
     {
    
      # Obtenemos la fecha de hoy en formato yymmdd
      $filedate= get-date -uformat "%y%m%d"
    
      # Obtenemos el nombre correspondiente al Log de hoy
      $archivodehoy= "ex$filedate`.log"
    
      # Si corresponde el fichero con el nombre obtenido lo moveremos
      # a la carpeta de copia
      If ($Dia -eq $archivodehoy)
      {
       move-item "\\ring\e$\Logs\$Servidor\$Dia" "\\ring\e$\Copia\$Servidor\$Dia"
      } 
      # Si no coincide el nombre del fichero con el obtenido...
      else
      {
       # Cargamos en $a el contenido del fichero
       $a= get-content "\\ring\e$\Logs\$servidor\$Dia"
    
       # Obtenemos la división entera del total de líneas del fichero
       # y 150000, pues lo dividiremos en ficheros de 150000 líneas
       $counta1 = [math]::floor([int] $a.count / [int] 150000)
    
       For ($s=0; $s -le $counta1; $s++)
       {
    
        # Obtenemos el indice de la primera línea del fichero del trozo actual
        $Inicio = $s * 150000
    
        # Obtenemos la última línea
        $Fin = $Inicio + 149999
    
        # Si la última línea es superior al total de la cuenta menos 1, es que es
        # el último trozo, y su fin está en el total de la cuenta menos 1
        If(($Fin - 1) -gt $a.Count){$Fin = $a.Count - 1}
    
        # Volcamos el trozo en el fichero correspondiente
        $a[$Inicio..$Fin] | Out-File "\\ring\e$\Logs\$Servidor\partit$("{0:D4}" -f $s).log"
        
        find /v '"#'" '"\\ring\e$\Logs\$Servidor\partit$("{0:D4}" -f $s).log'" | out-file \\ring\e$\nuevo.log
        $Server = 'ring'
        $sqlcon = New-Object System.Data.SqlClient.SqlConnection
        $sqlcon.ConnectionString = "Data Source=$server;Integrated Security=True"
        $sqlcon.open()
        $sqlcmd = New-Object Data.SqlClient.SqlCommand
        $sqlcmd = $sqlcon.CreateCommand()
        $sqlcmd.Connection = $sqlcon
        $sqlcmd.CommandText = "use PerformanceStats BULK INSERT Stats FROM '\\ring\e$\nuevo.log' WITH (FIELDTERMINATOR= ' ', ROWTERMINATOR = '\n' );"
        $sqlcmd.ExecuteNonQuery()
        $sqlcon.close()
        remove-item \\ring\e$\nuevo.log
    
       } # For $s
      } # If $Dia
     } # ForEach $Dia
    } # ForEach $Servidor
    
    
    
    martes, 20 de abril de 2010 9:22
  • Tienes un error en Find, en lugar de quitar el significado con acento grave lo haces con comillas simple, lo que no quita el significado. Tú tienes:

    find /v '"#'" '"\\ring\e$\Logs\$Servidor\partit$("{0:D4}" -f $s).log'" | out-file \\ring\e$\nuevo.log

    Cuando deberías tener:

     find /v `"#`" `"\\ring\e$\Logs\$Servidor\partit$("{0:D4}" -f $s).log`" | out-file \\ring\e$\nuevo.log

    Respecto a lo de la conexión, basta con que pongas comentarios para saber dónde estás insertando:

     # Establecemos el comando de inserción en base de datos
     $sqlcmd.CommandText = "use PerformanceStats BULK INSERT Stats FROM '\\ring\e$\nuevo.log' WITH (FIELDTERMINATOR= ' ', ROWTERMINATOR = '\n' );"
    
     # Realizamos la inserción en la base de datos
     $sqlcmd.ExecuteNonQuery()
    

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    martes, 20 de abril de 2010 9:46
    Moderador
  • otro error que me da mucho es la sobrecarda de la variable $a tendria que crear para cada vez que hago un get-content crear una variable no?'? asi me ahorraria este error cada vez :D
    martes, 20 de abril de 2010 10:17
  • esto si al acer el find ara ya me funciona bien gracias a ti pero me pone una linea diciendo ---------- \\RING\E$\LOGS\servidor\PARTIT0000.LOG  que claro al bulkar me sale el error de que ese paramentro no es correcto :( ay alguna manerda de acer el find sin que aparezca esta linea?
    martes, 20 de abril de 2010 10:29
  • Sería peor el remedio que la enfermedad, pues cada variable que creases ocuparía un nuevo espacio de memoria sin estar vaciada la anterior. No sé, me temo que esos ficheros son demasiado grandes. No obstante podemos probar a vaciar la variable a ver sí eso lo arregla. Cambia:

     } # ForEach $Dia
    } # ForEach $Servidor

    Por:

     } # ForEach $Dia
     $a = ""
    } # ForEach $Servidor

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    martes, 20 de abril de 2010 10:39
    Moderador
  • Yo prove con el clear-variable pero no me funcionava mucho si que me la vaciava pero luego daba el mismo error. Pero al terminar el script estas nuevas variables se borran aliberando memoria
    martes, 20 de abril de 2010 10:43
  • ¿Has probado si se produce error si sólo troceamos los ficheros, sin hacer los inserts? Si así también se produce error, me temo que tendrás que usar una utilidad de troceo de los ficheros (prueba la que te indiqué antes), dado que Get-Content no es capaz de cargar los ficheros de manera paginada, los carga enteros, y éstos son muy grandes. Te recuerdo la utilidad:

    Text File Splitter
    http://www.systemwidgets.com/Downloads/FreewareDownloads/TextFileSplitter/tabid/120/Default.aspx


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    • Marcado como respuesta Ismael Borche viernes, 1 de abril de 2011 2:14
    martes, 20 de abril de 2010 10:54
    Moderador
  • una cosa que cuando hago el find como me dijiste me crea una linea diciendome la ruta :( es possible omitirla?
    miércoles, 21 de abril de 2010 8:21
  • lo de el programa de terceros no me iria muy bien porque este scrrip tiene te ejectuarse cada dia para reprocesar los datos :( la idea mas facil es crear nuevas variables cada vez que haga un get-content pero no se muy bien como hacerlo ya que tendria q utilizar punteros. Y cuando toy dividiendo el fichero tambien utilizo punteros
    miércoles, 21 de abril de 2010 8:33
  • Por desgracia FIND no permite omitir N lineas al principio. No obstante podemos evitar las dos primeras líneas (la primera está en blanco y la segunda contiene la ruta) si usamos otra variable para almacenar el resultado de find, podremos quitarlas:

    $b = find /v `"#`" `"\\ring\e$\Logs\$Servidor\partit$("{0:D4}" -f $s).log`"
    $b[2..($b.Count -1)] | out-file \\ring\e$\nuevo.log
    

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    miércoles, 21 de abril de 2010 9:08
    Moderador
  • es una buena idea pero me pasaria como en la $a que cuando llevase unas cuantas me saltaria el error de siempre xD :(
    miércoles, 21 de abril de 2010 9:33
  • Sigo sin entender lo que quieres decir con lo crear nuevas variables: si es lo que yo entiendo, sería peor, pues si creas una nueva variable ésta ocupará en memoria el contenido del primer fichero y ahí se quedará, creas otra para el siguiente y ocupará en memoria el contenido del siguiente fichero, mientras sigue en memoria el anterior ¡te comerás la memoria en un santiamén!

    He hecho pruebas con ese programa y lo hace bien, podrías invocarlo desde el script. Pongamos que lo has descomprimido en "c:\Text File Splitter":

    & "c:\Text File Splitter\TextFileSplitterConsole.exe" `
          `-i="\\ring\e$\Logs\$servidor\$Dia" `
          `-o="\\ring\e$" `-splitstrategy:ls:5 `
          `-filepattern:partit[SEQUENCE:0000].log

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    miércoles, 21 de abril de 2010 10:04
    Moderador
  • Es lo mismo que pienso yo ¿Por qué no pruebas a trocear el fichero con TextFileSplitter? De esa manera no sería nunca necesario hacer "$a = get-content", pues lo unico que tendrías que hacer es trocear los ficheros y en un bucle posterior recorrer los ficheros resultantes haciendo el insert con cada uno.
    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    miércoles, 21 de abril de 2010 10:19
    Moderador
  • envers de utilizar el find o findstr podria utilizar el where¿¿¿¿

    estado mirando y tambien coje los valores o omite valores que no quieres

    aun asi no acaba de funcionarme :(

    viernes, 30 de abril de 2010 8:16
  • hola fernando muchas gracias por tu ayuda:D

    ya termine el programilla funciona al 100% :D

    viernes, 30 de abril de 2010 9:10
  • ¡¡Ya creía que habías pasado de mí!! :-))

    Me alegra de que se solucionasen tus problemas ¿Podrías poner el código final (cambia todo aquello que pueda identificar datos tuyos)? Es una curiosidad malsana. :-)


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    viernes, 30 de abril de 2010 9:37
    Moderador