Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: ferrec en 15 Enero 2015, 16:43 pm



Título: Crear directorio del mes actual en BAT
Publicado por: ferrec en 15 Enero 2015, 16:43 pm
Hola, tengo una question que me esta volviendo loco y no encuentro una solucion... a ver si me podeis echar un cable por favor..

Lo que me gustaria hacer es crear un directorio con el mes actual, por ejemplo si estamos en enero, que reconozca que estamos en este mes y genere ese directorio llamado "enero", creo que es algo sencillo pero no se como hacerlo...lo que he podido es hacer directorios con el formato  día/mes/año pero no solo con el mes actual.


Muchas gracias


Título: Re: Crear directorio del mes actual en BAT
Publicado por: el-brujo en 15 Enero 2015, 17:16 pm
Tienes que usar el comando "date"

Código
  1. @echo off
  2. mkdir directorio %DATE%

Ejemplo:

Código
  1. @ECHO OFF
  2. @ECHO RESPALDO DE ARCHIVOS
  3. REM creamos una variable conteniendo la fecha actual con el formato año-mes-dia
  4. SET FOLDER=%date:~6,4%-%date:~3,2%-%date:~0,2%
  5. REM Creamos la carpeta donde se guardará la copia de respaldo
  6. IF NOT EXIST Backup MKDIR Backup
  7. MKDIR Backup%FOLDER%
  8. REM Seteamos las propiedades del comando XCOPY
  9. SET BACKUPCMD=XCOPY /S /C /D /E /H /I /R /Y
  10. REM Ejecutamos la instrucción
  11. %BACKUPCMD% Actual. Backup%FOLDER%


Título: Re: Crear directorio del mes actual en BAT
Publicado por: ferrec en 15 Enero 2015, 18:05 pm
Hola gracias por la respuesta...pero DATE es la fecha completa
al crear el directorio se crearia 15/01/2014 y no el mes solamente que es lo que busco.

No se si me he explicado bien, perdonad...

lo que necesito es un bat para que me genere un directorio solamente con el MES actual.

Mil gracias de nuevo por tu respuesta


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Eleкtro en 16 Enero 2015, 05:38 am
Hola

No es posible obtener el nombre de un mes específico mediante un lenguaje limitado como es Batch, no de forma natural.

Puedes hacerlo así:

Código
  1. @Echo Off & Title GetMonthName by Elektro
  2. (CHCP 1252)1>NUL
  3.  
  4. Call :GetMonthName
  5. Echo [+] Current Month Is: "%monthName%"
  6. :: MKDir ".\%monthName%"
  7.  
  8. Pause&Exit /B 0
  9.  
  10. :GetMonthName
  11. Set    "monthNames=Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre"
  12. Set /A "monthInt=%date:~3,2%" & REM Set For DD/MM/YYYY
  13. For /F "Tokens=%monthInt%" %%# in ('Echo %monthNames%') do (
  14.   Set "monthName=%%#"
  15.   Exit /B 0
  16. )
  17. Goto:EOF

PD: En cualquier otro lenguaje sería una tarea simple de llevar a cabo, por ejemplo en VBS, otor lenguaje sencillo que podrías usar en vez de Batch.

Saludos


Título: Re: Crear directorio del mes actual en BAT
Publicado por: ferrec en 16 Enero 2015, 10:22 am
gracias Eleкtro, lo he probado como me has puesto pero solo me muestra el mes y no me genera el directorio , no me importa que no sea natural, solo que cuando ejecute el bat si no existe el directorio del mes actual que me lo cree...  

Una pregunta...es mas sencillo que el bat llame a VB me genere este directorio si no exite y luego continue con el Bat? ...Perdona por mi ignorancia  :-[

Gracias de nuevo pr tu ayuda :)



Ya esta solucionado...solamente me preguntaba pero no se porque no me lo generaba... le he quitado el echo que me mostraba el mes y le he dejado el mkdir que cree el directorio...


Gracias  ;-)

Código
  1. Echo Off & Title GetMonthName by Elektro
  2. (CHCP 1252)1>NUL
  3.  
  4. Call :GetMonthName
  5. rem Echo [+] Current Month Is: "%monthName%"
  6. MKDir ".\%monthName%"
  7.  
  8. Pause&Exit /B 0
  9.  
  10. :GetMonthName
  11. Set    "monthNames=Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre"
  12. Set /A "monthInt=%date:~3,2%" & REM Set For DD/MM/YYYY
  13. For /F "Tokens=%monthInt%" %%# in ('Echo %monthNames%') do (
  14.   Set "monthName=%%#"
  15.   Exit /B 0
  16. )
  17. Goto:EOF



[MOD]: Está prohibido hacer doble post


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Eleкtro en 16 Enero 2015, 10:31 am
gracias Eleкtro, lo he probado como me has puesto pero solo me muestra el mes y no me genera el directorio , no me importa que no sea natural, solo que cuando ejecute el bat si no existe el directorio del mes actual que me lo cree...  

Examina bien el código y verás que no te genera la carpeta porqué añadí una linea de comentario, descoméntala y todo irá bien,
de todas formas se supone que deberías saber como se crea una carpeta, eso es lo mínimo si vas a utilizar Batch.
EDITO: ya vi que lo modificaste :P

Una pregunta...es mas sencillo que el bat llame a VB me genere este directorio si no exite y luego continue con el Bat? ...Perdona por mi ignorancia  :-[

Puedes hacer una especie de hibridación en el script para generar el VBS desde Batch y llamarlo y si quieres incluso devolver una respuesta y utilizarla, requiere más código, ya tienes una forma que funciona, úsala, en resumen "es lo mismo", jeje

Saludos!


Título: Re: Crear directorio del mes actual en BAT
Publicado por: ferrec en 16 Enero 2015, 10:42 am
Gracias de nuevo... muy buena ayuda!  ;D


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 9 Octubre 2015, 16:37 pm
Saludos;

Yo tengo que hacer algo parecido pero de la siguiente manera:
1.- El usuario indica (en numeros) el mes. Es decir que hay que validar que solo coloque dos caracteres y que sean numeros entre 01 y 12.
2.- Verificar si la carpeta mes con el año está creada. Ejemplo: Si el usuario indica 09 entonces la carpeta sería Septiembre2015.
3.- Si la carpeta no existe;se crea la carpeta con el mes y el año, ejemplo Septiembre2015
4.- Buscar en el directorio donde se está ejecutando el bath todas las carpetas cuya estructura sea año, mes, dia corresponda al mes de la carpeta que acabo de crear y mover esas carpetas a la que acabo de crear. Ejemplo
Si cree la carpeta miruta/Septiembre2015 y en miruta/ hay carpetas 20150901, 20150902 ... hasta 20150930 y moverla a  miruta/Septiembre2015

Me podrías orientar en como hacerlo, no tengo ni idea.

Desde ya mil gracias....


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Mad Antrax en 9 Octubre 2015, 17:05 pm
Saludos;

Yo tengo que hacer algo parecido pero de la siguiente manera:
1.- El usuario indica (en numeros) el mes. Es decir que hay que validar que solo coloque dos caracteres y que sean numeros entre 01 y 12.
2.- Verificar si la carpeta mes con el año está creada. Ejemplo: Si el usuario indica 09 entonces la carpeta sería Septiembre2015.
3.- Si la carpeta no existe;se crea la carpeta con el mes y el año, ejemplo Septiembre2015
4.- Buscar en el directorio donde se está ejecutando el bath todas las carpetas cuya estructura sea año, mes, dia corresponda al mes de la carpeta que acabo de crear y mover esas carpetas a la que acabo de crear. Ejemplo
Si cree la carpeta miruta/Septiembre2015 y en miruta/ hay carpetas 20150901, 20150902 ... hasta 20150930 y moverla a  miruta/Septiembre2015

Me podrías orientar en como hacerlo, no tengo ni idea.

Desde ya mil gracias....


Te ayudo un poquito... lo he programado en VBS en lugar de Bat/Batch, es un lenguaje mucho más sencillo de implementar bajo mi punto de vista:

Código
  1. '1.- El usuario indica (en numeros) el mes. Es decir que hay que validar que solo coloque dos caracteres y que sean numeros entre 01 y 12.
  2. '2.- Verificar si la carpeta mes con el año está creada. Ejemplo: Si el usuario indica 09 entonces la carpeta sería Septiembre2015.
  3. '3.- Si la carpeta no existe;se crea la carpeta con el mes y el año, ejemplo Septiembre2015
  4. '4.- Buscar en el directorio donde se está ejecutando el bath todas las carpetas cuya estructura sea año, mes, dia corresponda al mes de la carpeta que acabo de crear y mover esas carpetas a la que acabo de crear. Ejemplo
  5. 'Si cree la carpeta miruta/Septiembre2015 y en miruta/ hay carpetas 20150901, 20150902 ... hasta 20150930 y moverla a  miruta/Septiembre2015
  6.  
  7. Set oFSO = CreateObject("Scripting.FileSystemObject")
  8.  
  9. iMes = InputBox("Introduce el mes: ")
  10.  
  11. If isNumeric(iMes) = False Then
  12. While isNumeric(iMes) = False
  13. MsgBox "Solo se permiten valores numéricos", vbExclamation + vbOkOnly
  14. iMes = InputBox("Introduce el mes: ")
  15. Wend
  16. End If
  17.  
  18. If iMes < 1 Or iMes > 12 Then
  19. While iMes < 1 Or iMes > 12
  20. MsgBox "Solo se permiten valores numéricos entre 1 y 12", vbExclamation + vbOkOnly
  21. iMes = InputBox("Introduce el mes: ")
  22. Wend
  23. End If
  24.  
  25. Select Case iMes
  26. Case 1
  27. sMes = "Enero"
  28. Case 2
  29. sMes = "Febrero"
  30. Case 3
  31. sMes = "Marzo"
  32. Case 4
  33. sMes = "Abril"
  34. Case 5
  35. sMes = "Mayo"
  36. Case 6
  37. sMes = "Junio"
  38. Case 7
  39. sMes = "Julio"
  40. Case 8
  41. sMes = "Agosto"
  42. Case 9
  43. sMes = "Septiembre"
  44. Case 10
  45. sMes = "Octubre"
  46. Case 11
  47. sMes = "Noviembre"
  48. Case 12
  49. sMes = "Diciembre"
  50. End Select
  51.  
  52. sFolder = sMes & Year(Now)
  53.  
  54. If oFSO.FolderExists(sFolder) = True Then
  55. MsgBox "La carpeta " & sFolder & " ya existe", vbInformation + vbOkOnly
  56. Else
  57. MsgBox "La carpeta " & sFolder & " no existe", vbInformation + vbOkOnly
  58. oFSO.CreateFolder(sFolder)
  59. End If

Verás que el punto (4) no lo he programado, te lo dejo para ti :) con el objeto oFSO podrás hacerlo sin problemas. Si tienes dudas pregunta, pero dale un poco al coco :)


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 9 Octubre 2015, 17:17 pm
Me haz dejado loco jajajajaja.

Gracias mil.

Pensé en hacerlo en VB.net.

Voy a darle por allí a ver que logro.

Te podré contactar por este hilo o abro uno nuevo?


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Mad Antrax en 9 Octubre 2015, 17:26 pm
Me haz dejado loco jajajajaja.

Gracias mil.

Pensé en hacerlo en VB.net.

Voy a darle por allí a ver que logro.

Te podré contactar por este hilo o abro uno nuevo?

Utiliza éste

Mi codigo es VBS, copia y pega todo el codigo en un "bloc de notas" (notepad) y guarda el contenido con el nombre que desees, pero asegúrate de guardarlo con la extensión .vbs al final. Le das doble-click y lo pruebas.

Verás que he implementado las opciones 1, 2 y 3. Falta la 4 que es un poco más compleja. Necesitarás saber el formato de nombres EXACTO que se utiliza en las carpetas existentes, hacer un Mid() para leer la posición del mes en el nombre, comparar y luego llamar a la función CopyFolder o MoveFolder del objeto oFSO

Si tienes dudas pregunta por aquí mismo


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 9 Octubre 2015, 23:24 pm
Saludos Mad;

Gracias mil de nuevo, me puse a investigar y encontré el vbsedit que es un editor para vbs y funciona al pelo.

Te confieso que no soy programador nato así que me estoy rompiendo el coco para ver como logro llevar el concepto al código.

Pues estoy claro en lo que necesito pero no se como aplicarlo, googleando encontré este script:

Código:
Dim fso, folder, subFlds, fld, s
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(path)
Set subFlds = folder.SubFolders
s = ""
For Each fld in subFlds
   s = s & fld.name
   s = s & "<br />"
Next
ShowFolderList = s

Pero cuando se ejecuta la instrucción
Código:
Set folder = fso.GetFolder(path) 
me da error de Acceso Denegado.

Teoricamente este me lista las carpetas que estan al mismo nivel de donde se está ejecutando el script, luego de esto debo mover las carpetas hacia la carpeta creada. El asunto es que las carpetas a mover deben corresponder al mes de la carpeta que se creo.

De pana que mil gracias por la ayuda hermano...


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Mad Antrax en 9 Octubre 2015, 23:29 pm
Te veo perdido jejeje, pero al menos veo que te has buscado las castañas y no vas mal encaminado.

Estoy en una partida de league of legends, dame 30 minutos y te respondo con el codigo correcto


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 9 Octubre 2015, 23:48 pm
Perdido no perdidisimo jajajajajaja.

Se lo necesito, lo que no se es como hacerlo....

Gracias pana....


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Mad Antrax en 10 Octubre 2015, 00:44 am
Me haz dejado loco jajajajaja.

Gracias mil.

Pensé en hacerlo en VB.net.

Voy a darle por allí a ver que logro.

Te podré contactar por este hilo o abro uno nuevo?

Aquí lo tienes

Código
  1. Set oFSO = CreateObject("Scripting.FileSystemObject")
  2.  
  3. iMes = InputBox("Introduce el mes: ")
  4.  
  5. If isNumeric(iMes) = False Then
  6. While isNumeric(iMes) = False
  7. MsgBox "Solo se permiten valores numéricos", vbExclamation + vbOkOnly
  8. iMes = InputBox("Introduce el mes: ")
  9. Wend
  10. End If
  11.  
  12. If iMes < 1 Or iMes > 12 Then
  13. While iMes < 1 Or iMes > 12
  14. MsgBox "Solo se permiten valores numéricos entre 1 y 12", vbExclamation + vbOkOnly
  15. iMes = InputBox("Introduce el mes: ")
  16. Wend
  17. End If
  18.  
  19. Select Case iMes
  20. Case 1
  21. sMes = "Enero"
  22. Case 2
  23. sMes = "Febrero"
  24. Case 3
  25. sMes = "Marzo"
  26. Case 4
  27. sMes = "Abril"
  28. Case 5
  29. sMes = "Mayo"
  30. Case 6
  31. sMes = "Junio"
  32. Case 7
  33. sMes = "Julio"
  34. Case 8
  35. sMes = "Agosto"
  36. Case 9
  37. sMes = "Septiembre"
  38. Case 10
  39. sMes = "Octubre"
  40. Case 11
  41. sMes = "Noviembre"
  42. Case 12
  43. sMes = "Diciembre"
  44. End Select
  45.  
  46. sFolder = sMes & Year(Now)
  47.  
  48. If oFSO.FolderExists(sFolder) = True Then
  49. MsgBox "La carpeta " & sFolder & " ya existe", vbInformation + vbOkOnly
  50. Else
  51. MsgBox "La carpeta " & sFolder & " no existe", vbInformation + vbOkOnly
  52. oFSO.CreateFolder(sFolder)
  53. End If
  54.  
  55. Parent = oFSO.GetParentFolderName(WScript.ScriptFullName)
  56.  
  57. Set Folder = oFSO.GetFolder(Parent)
  58. Set SubFolder = Folder.SubFolders
  59. For Each SubFolders in SubFolder
  60. If isNumeric(SubFolders.Name) = True Then
  61. If Len(SubFolders.Name) = 8 Then
  62. If CInt(Mid(SubFolders.Name, 5, 2)) = CInt(iMes) Then
  63. Call oFSO.MoveFolder(Parent & "\" & SubFolders.Name, Parent & "\" & sFolder & "\" & SubFolders.Name)
  64. End If
  65. End If
  66. End If
  67. Next
  68. msgbox "Script finalizado"

Funciona si la estructura de carpetas es "AÑO MES DIA", por ejemplo:

20150327

El Script, después de introducir 3 (marzo) te moverá las carpetas cuyo nombre sea xxxx03xx dentro de Marzo2015

Lee las líneas, se entienden solas.


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Eleкtro en 10 Octubre 2015, 04:56 am
Pensé en hacerlo en VB.net.

El código del compañero @Mad Antrax está muy pero que muy bien, sin embargo, al escucharte decir eso me han entrado ganas de mostrarte un ejemplo alternativo e iguálmente funcional en dicho lenguaje, ya que igual que tengo bien sabido que @Mad Antrax ama VBS, yo amo Vb.Net :P. Si lo hicieras en .Net (VB.Net o C#) la eficacia general del código aumentaria considerablemente en comparación con un lenguaje de scripting limitado (sobre todo si hablamos de Batch), aunque en realidad, con VBS tienes más que suficiente para llevar a cabo esa tarea.

Aquí tienes el archivo de la solución de Visual Studio 2013, como ya he mencionado cumple todas las funciones que has pedido, eso sí, lo que quieras añadir o modificar ya es cosa tuya. Si tienes preguntas sobre este lenguaje por favor hazlas en el subforo correspondiente, no desviemos más el tema aquí.

(http://i.imgur.com/7Jbay2L.png)

http://www.mediafire.com/download/4qoklj8s64jwuvv/WindowsApplication6.rar


Y aquí te muestro parte del código fuente. El resto del código que no muestro aquí simplemente es el código generado automaticamente por VS, el código de la UI.

Por mencionar algo de este código que te puede interesar rehutilizable para el futuro, en la función GetMonthName utilizo un objeto de globalización , CultureInfo, del cual obtengo de forma administrada los nombres de los meses en la cultura específica, en este caso "es-ES".

Te lo he dejado todo con varios comentarios para que te ayuden a comprender lo que hago.

MainForm.vb
Código
  1. Imports System
  2. Imports System.IO
  3. Imports System.Linq
  4. Imports System.Windows.Forms
  5.  
  6. Public NotInheritable Class MainForm : Inherits Form
  7.  
  8.    Private year As Integer = DateTime.Today.Year ' O... '2015'
  9.    Private sourceDir As String = Directory.GetCurrentDirectory() ' O... ".\"
  10.  
  11.    Public Sub New()
  12.  
  13.        Me.InitializeComponent()
  14.  
  15.        With Me.DTPMonth ' Personalizo el formato de entrada del DateTimePicker.
  16.            .CustomFormat = "MM" ' 01-12
  17.            .Format = DateTimePickerFormat.Custom
  18.            .Value = DateTime.Today
  19.        End With
  20.  
  21.    End Sub
  22.  
  23.    Private Sub BtAccept_Click(ByVal sender As Object, ByVal e As EventArgs) _
  24.    Handles BtAccept.Click
  25.  
  26.        ' Obtengo la ruta absoluta del directorio con fecha. (ej. "C:\Ruta\Octubre2015")
  27.        Dim monthNumber As Integer = Me.DTPMonth.Value.Month
  28.        Dim dateDir As String = DateUtil.GetDateDirPath("es-ES", Me.sourceDir, Me.year, monthNumber)
  29.  
  30.        ' Creo el directorio con fecha (si no existe).
  31.        DateUtil.CreateDirectory(dateDir)
  32.  
  33.        ' Muevo los directorios (si alguno) con formato de fecha específico (ej. "yyyyMMdd"), del directorio fuente, al directorio de destino.
  34.        DateUtil.MoveDateDirectories(Me.year, monthNumber, DateUtil.DirNameFormat, sourceDir, dateDir)
  35.  
  36.    End Sub
  37.  
  38.    Private Sub BtCancel_Click(ByVal sender As Object, ByVal e As EventArgs) _
  39.    Handles BtCancel.Click
  40.  
  41.        ' Cierro este form, y con él termina la ejecución de la aplicación.
  42.        Me.Close()
  43.  
  44.    End Sub
  45.  
  46. End Class

+

DateUtil.vb
Código
  1. Imports System
  2. Imports System.Globalization
  3. Imports System.IO
  4. Imports System.Linq
  5. Imports System.Security.AccessControl
  6. Imports System.Security.Principal
  7.  
  8. Public Module DateUtil
  9.  
  10.    ''' <summary>
  11.    ''' El formato por defecto del nombre de directorio. ("yyyyMMdd" equivale a "AñoMesDia").
  12.    ''' </summary>
  13.    ''' <remarks>
  14.    ''' El formato se puede cambiar, pero respetando los especificadores actuales, que son "yyyy", "MM" y "dd", los cuales son intercambiables entre si.
  15.    ''' Para usar otros especificadores haría falta una refactorización del código (el método <see cref="MoveDateDirectories"/>) para implementar su soporte.
  16.    ''' Los especificadores disponibles se pueden encontrar en la documentación online de MSDN:
  17.    ''' https://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx
  18.    ''' </remarks>
  19.    Public Const DirNameFormat As String = "yyyyMMdd" ' ej. "20150131"
  20.  
  21.    ''' <summary>
  22.    ''' Devuelve el nombre de un mes del año, en el lenguaje específicado.
  23.    ''' </summary>
  24.    Public Function GetMonthName(ByVal cultureName As String,
  25.                                 ByVal month As Integer) As String
  26.  
  27.        If (month < 1I) OrElse (month > 12I) Then
  28.            Throw New ArgumentOutOfRangeException(paramName:="month", message:="A value from range '1' to '12' is required.")
  29.  
  30.        ElseIf Not (From ci As CultureInfo In CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures)
  31.                    Where ci.Name.Equals(cultureName, StringComparison.OrdinalIgnoreCase)).Any Then
  32.            Throw New NotImplementedException(message:=String.Format("Culture '{0}' not recognized, maybe name is wrong typed or culture is not installed.", cultureName))
  33.  
  34.        Else
  35.            Dim ci As CultureInfo = CultureInfo.GetCultureInfo(cultureName)
  36.            Return ci.TextInfo.ToTitleCase(ci.DateTimeFormat.MonthNames(month - 1))
  37.  
  38.        End If
  39.  
  40.    End Function
  41.  
  42.    ''' <summary>
  43.    ''' Devuelve la ruta absoluta del directorio de destino con el nombre de la fecha, en el lenguaje específicado.
  44.    ''' ej. "C:\Ruta\Octubre2015"
  45.    ''' </summary>
  46.    Public Function GetDateDirPath(ByVal cultureName As String,
  47.                                   ByVal targetDir As String,
  48.                                   ByVal year As Integer,
  49.                                   ByVal month As Integer) As String
  50.  
  51.        If (CStr(year).Length <> 4I) Then
  52.            Throw New ArgumentOutOfRangeException(paramName:="year", message:="A value of 4 digits' is required.")
  53.  
  54.        ElseIf (month < 1I) OrElse (month > 12I) Then
  55.            Throw New ArgumentOutOfRangeException(paramName:="month", message:="A value from range '1' to '12' is required.")
  56.  
  57.        Else
  58.            Return Path.Combine(targetDir, String.Format("{0}{1}", DateUtil.GetMonthName(cultureName, month), year))
  59.  
  60.        End If
  61.  
  62.    End Function
  63.  
  64.    ''' <summary>
  65.    ''' Crea un directorio en el directorio especificado.
  66.    ''' </summary>
  67.    Public Sub CreateDirectory(ByVal targetDir As String)
  68.  
  69.        ' Le asigno permisos de usuario personalizados a la carpeta existente o la carpeta que se creará.
  70.  
  71.        Dim userId As SecurityIdentifier = WindowsIdentity.GetCurrent.User
  72.        Dim dirSec As New DirectorySecurity
  73.        With dirSec
  74.            .AddAccessRule(New FileSystemAccessRule(userId, FileSystemRights.CreateDirectories, AccessControlType.Allow))
  75.            .AddAccessRule(New FileSystemAccessRule(userId, FileSystemRights.CreateFiles, AccessControlType.Allow))
  76.            .AddAccessRule(New FileSystemAccessRule(userId, FileSystemRights.ListDirectory, AccessControlType.Allow))
  77.            .AddAccessRule(New FileSystemAccessRule(userId, FileSystemRights.ReadAndExecute, AccessControlType.Allow))
  78.            .AddAccessRule(New FileSystemAccessRule(userId, FileSystemRights.Write, AccessControlType.Allow))
  79.            ' .AddAccessRule(New FileSystemAccessRule(userId, FileSystemRights.FullControl, AccessControlType.Allow))
  80.        End With
  81.  
  82.        If Directory.Exists(targetDir) Then
  83.            Directory.SetAccessControl(targetDir, dirSec)
  84.        Else
  85.            Directory.CreateDirectory(targetDir, directorySecurity:=dirSec)
  86.        End If
  87.  
  88.    End Sub
  89.  
  90.    ''' <summary>
  91.    ''' Mueve los directorios cuyo nombre contenga un formato de fecha especifico (intercambiable entre "yyyy", "MM", y "dd") al directorio de destino especificado.
  92.    ''' </summary>
  93.    Public Sub MoveDateDirectories(ByVal year As Integer,
  94.                                   ByVal month As Integer,
  95.                                   ByVal dateFormat As String,
  96.                                   ByVal sourceDir As String,
  97.                                   ByVal targetDir As String)
  98.  
  99.        If (CStr(year).Length <> 4I) Then
  100.            Throw New ArgumentOutOfRangeException(paramName:="year", message:="A value of 4 digits' is required.")
  101.  
  102.        ElseIf (month < 1I) OrElse (month > 12I) Then
  103.            Throw New ArgumentOutOfRangeException(paramName:="month", message:="A value from range '1' to '12' is required.")
  104.  
  105.        ElseIf (dateFormat.Replace("y", "").Replace("M", "").Replace("d", "").Length <> 0) Then
  106.            Throw New NotImplementedException(message:="Specified date format is not implemented, only 'yyyy', 'MM' and 'dd' are interchangeable.")
  107.  
  108.        ElseIf Not Directory.Exists(sourceDir) Then
  109.            Throw New DirectoryNotFoundException(message:=String.Format("Source directory not found: '{0}'", sourceDir))
  110.  
  111.        ElseIf Not Directory.Exists(targetDir) Then
  112.            Throw New DirectoryNotFoundException(message:=String.Format("Target directory not found: '{0}'", targetDir))
  113.  
  114.        Else
  115.            Dim sourceDirInfo As New DirectoryInfo(sourceDir)
  116.            Dim targetDirInfo As New DirectoryInfo(targetDir)
  117.  
  118.            ' Obtengo una colección con los nombres de directorio con el formato de fecha especificado. (ej. de Octubre 2015:  20151001 ... 20151031)
  119.            Dim dateDirNames As IEnumerable(Of String) =
  120.                From day As Integer In Enumerable.Range(1, DateTime.DaysInMonth(year, month))
  121.                Select dateFormat.Replace("yyyy", CStr(year)).
  122.                                  Replace("MM", CStr(month).PadLeft(2, "0"c)).
  123.                                  Replace("dd", CStr(day).PadLeft(2, "0"c))
  124.  
  125.            ' Obtengo una colección con las rutas absolutas de los directorios que cumplen las condiciones de formato de fecha.
  126.            Dim directories As IEnumerable(Of DirectoryInfo) =
  127.                From dirInfo As DirectoryInfo In sourceDirInfo.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
  128.                Where dateDirNames.Contains(dirInfo.Name)
  129.  
  130.            ' Un simple mensaje de información o aviso cuando no se encuentra ningún directorio el cual mover.
  131.            If (Not directories.Any) Then
  132.                Dim msg As String = String.Format("No ha sido encontrado ningún directorio en '{0}' que cumpla las condiciones de formato de fecha.", sourceDirInfo.FullName)
  133.                MessageBox.Show(msg, "By Elektro", MessageBoxButtons.OK, MessageBoxIcon.Information)
  134.  
  135.            Else
  136.                ' Por último, muevo los directorios que cumplieron las condiciones de formato de fecha.
  137.                For Each dirInfo As DirectoryInfo In directories
  138.  
  139.                    Debug.WriteLine(String.Format("Moviendo: {0}", dirInfo.FullName))
  140.  
  141.                    Try
  142.                        dirInfo.MoveTo(Path.Combine(targetDirInfo.FullName, dirInfo.Name))
  143.  
  144.                    Catch ex As Exception
  145. #If DEBUG Then
  146.                        Throw ex
  147. #Else
  148.                        MessageBox.Show(ex.Message & Environment.NewLine & ex.StackTrace, "By Elektro", MessageBoxButtons.OK, MessageBoxIcon.Error)
  149. #End If
  150.  
  151.                    End Try
  152.  
  153.                Next dirInfo
  154.  
  155.            End If ' Not directories.Any
  156.  
  157.        End If ' dateFormat...
  158.  
  159.    End Sub
  160.  
  161. End Module

Que lo apreveches.

Saludos!


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Mad Antrax en 10 Octubre 2015, 18:13 pm
jajaj, te saliste Eleкtro ;-)

Sí, yo adoro VBS, hoy en día es el único lenguaje que utilizo de forma profesional en el trabajo y la verdad me permite resolver todos los problemas y necesidades que se me plantean en el trabajo. Tu script en .net es awesome y mas elaborado con el control de errores y permisos, en definitiva; una pasada de codigo.

Un saludo jefe ;D


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 13 Octubre 2015, 16:53 pm
 ;-) ;-) ;-) ;-) ;-)

Son lo maximo chicos....

Mil gracias, yo tengo un libro de VB.Net me voy a poner a aprender pues este proceso no terminar aquí; hasta ahora han trabajado en el entorno lo que viene es la fusión de los archivos txt que están en cada carpeta.

Miren este archivo .bat

copy /y blancos\*.TXT .

copy CM.txt + C:\carp1\Emp1\20150908\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150908\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150908\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150908\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150908\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150908\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150909\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150909\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150909\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150909\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150909\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150909\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150910\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150910\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150910\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150910\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150910\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150910\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150911\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150911\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150911\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150911\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150911\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150911\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150912\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150912\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150912\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150912\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150912\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150912\IMP6003.txt IMP6003.txt

Fijense que el .bat hace un recorrido por cada carpeta y copia los archivos que estén en esta dentro de otr archivo con el mismo nombre que se encuentra en el nivel superior, es decir, si la carpeta ppal se llama Octubre2015 el proceso hace un recorrido por las carpetas desde la 20151001 hasta 2015610N (donde N es el último día del mes) y crea los archivos a fusionados.

El proceso de fusión de los archivos hace que los mismos contengan dentro un caracter especial que indica el fin de cada archivo, este caracter es como una fecla apuntando a la izquierda; la idea es que despues que el proceso de merge esté completado hay que entrar en cada archivo y limpiarlos.

Sería mucho pedir esto?

De pana que muchisimas gracias chicos, son lo maximo.


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Mad Antrax en 13 Octubre 2015, 17:32 pm
No he entendido nada xD


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Eleкtro en 13 Octubre 2015, 18:19 pm
El proceso de fusión de los archivos hace que los mismos contengan dentro un caracter especial que indica el fin de cada archivo, este caracter es como una fecla apuntando a la izquierda

Eso lo puedes solucionar realizando una copia en modo binario:

Cita de: CMD.exe
copy /?
Copia uno o más archivos en otra ubicación.

  /A           Indica un archivo de texto ASCII.
  /B           Indica un archivo binario.

De todas formas, permíteme una pregunta... si puedes manejarte con VB.Net o con VBS, ¿por qué utilizas Batch?, al menos para merger o fusionar archivos, con lo fácil y "limpio" que es en los lenguajes mencionados no tendrias problemas de ese tipo.

Saludos!


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 13 Octubre 2015, 21:46 pm
Saludos chicos de nuevo gracias por el apoyo y mil disculpas por la joda;

Les explico paso a paso:
1.- El usuario indica (en numeros) el mes. Es decir que hay que validar que solo coloque dos caracteres y que sean numeros entre 01 y 12.
2.- Verificar si la carpeta mes con el año está creada. Ejemplo: Si el usuario indica 09 entonces la carpeta sería Septiembre2015.
3.- Si la carpeta no existe;se crea la carpeta con el mes y el año, ejemplo Septiembre2015
4.- Buscar en el directorio donde se está ejecutando el bath todas las carpetas cuya estructura sea año, mes, dia corresponda al mes de la carpeta que acabo de crear y mover esas carpetas a la que acabo de crear. Ejemplo
Si cree la carpeta miruta/Septiembre2015 y en miruta/ hay carpetas 20150901, 20150902 ... hasta 20150930 y moverla a  miruta/Septiembre2015
YA TODO ESTO ESTA
5.- Luego de haber movido las carpetas al direcotorio el script entra en la carpeta del día 1 y copia la información sobre otro archivo y sí susesivamente hasta el ultimo día. Esto hará que al final el archivo resultante tendra la información de todos los días.
Yo supongo que el script entra en un for desde el primer día hasta el ultimo y dentro del for estaría la sentencia de comiando.
Sería algo así:
Para dia=1 hasta dia=31
 copiar en archivoA plantilla la información del archivoA
 copiar en archivoB plantilla la información del archivoB
Fin para

6.- Buscar caracter especial en los archivos CM.txt; GL.txt; IMP6000.txt;IMP6001.txt; IMP6002.txt y IMP6003.txt y eliminarlo.

7.- Cerrar archivos.

Me da pena con ustedes mi pana; pero la programación no es mi fuerte; trabajo en el área de tecgonologia a nivel de administración de recursos pero he adquirido una nueva responsabilidad y pues me toca tirar codigo, pero este script es urgente que lo haga.

Sin mas;

elqueteconte


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 14 Octubre 2015, 00:03 am
Eso lo puedes solucionar realizando una copia en modo binario:

De todas formas, permíteme una pregunta... si puedes manejarte con VB.Net o con VBS, ¿por qué utilizas Batch?, al menos para merger o fusionar archivos, con lo fácil y "limpio" que es en los lenguajes mencionados no tendrias problemas de ese tipo.

Saludos!


Saludos Alektro;

Gracias oir tu tiempo.

Yo manejo .bath pues cuando comencé con el proceso de integración, uno de los pasos era el usar este script el cual tenía que editar cada vez que hubiesen mas días por agregar, es por ello que vez en el script como se repite el mismo comando y solo cambia el día, claro cada vez que agregas un día el comando copy se repite 6 veces.

De nuevo quiero expresarte mi agradecimiento por el apoyo.

Ya estoy bajando el Visual Studio Express para ver y estudiar el código.

Sin mas,

elqueteconte


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 14 Octubre 2015, 17:30 pm
Eso lo puedes solucionar realizando una copia en modo binario:

De todas formas, permíteme una pregunta... si puedes manejarte con VB.Net o con VBS, ¿por qué utilizas Batch?, al menos para merger o fusionar archivos, con lo fácil y "limpio" que es en los lenguajes mencionados no tendrias problemas de ese tipo.

Saludos!

Estoy investigando de como leer las carpetas que se movieron y luego copiar su contenido.
Inicialmente tendría que entrar en carpeta por carpeta para copiar los archivos, claro como el número de carpetas puede variar entonces tendría que manejarlo con un for y luego que entre en cada carpeta hacer el copy la función sería mas o menos así:

Código
  1. Private Sub UnirTxt()
  2.        ' Declaro las variables de los archivos TXT
  3.        Dim CM As String() = Directory.GetFiles(dateDir, "CM.txt")
  4.        Dim GL As String() = Directory.GetFiles(dateDir, "GL.txt")
  5.        Dim IMP60 As String() = Directory.GetFiles(dateDir, "IMP6000.txt")
  6.        Dim IMP61 As String() = Directory.GetFiles(dateDir, "IMP6001.txt")
  7.        Dim IMP62 As String() = Directory.GetFiles(dateDir, "IMP6002.txt")
  8.        Dim IMP63 As String() = Directory.GetFiles(dateDir, "IMP6003.txt")
  9.  
  10.        ' Declaro las carpetas que estan dentro de la carpeta creada
  11.        Dim Folders As New DirectoryInfo(dateDir)
  12.  
  13.        'Verifico si existen los archivos, en caso de existir los elimino.
  14.        If File.Exists(CM(0)) Then File.Delete(CM(0))
  15.        If File.Exists(GL(0)) Then File.Delete(GL(0))
  16.        If File.Exists(IMP61(0)) Then File.Delete(IMP61(0))
  17.        If File.Exists(IMP62(0)) Then File.Delete(IMP62(0))
  18.        If File.Exists(IMP63(0)) Then File.Delete(IMP63(0))
  19.  
  20.        Dim swcm As New StreamWriter(CM(0))
  21.        Dim swgl As New StreamWriter(GL(0))
  22.        Dim swi60 As New StreamWriter(IMP60(0))
  23.        Dim swi61 As New StreamWriter(IMP61(0))
  24.        Dim swi62 As New StreamWriter(IMP62(0))
  25.        Dim swi63 As New StreamWriter(IMP63(0))
  26.  
  27.        'Entro en cada carpeta día
  28.        For Each Folder As DirectoryInfo In Folders.GetDirectories
  29.            ' Tomo el nombre del archivo y hago la copia
  30.            For Each txtfile As FileInfo In Folder.GetFiles
  31.                If Mid(txtfile.Name, 1, 2) = "CM" Then
  32.                    swcm.Write(File.ReadAllText(txtfile.FullName))
  33.                End If
  34.                If Mid(txtfile.Name, 1, 2) = "GL" Then
  35.                    swgl.Write(File.ReadAllText(txtfile.FullName))
  36.                End If
  37.                If Mid(txtfile.Name, 6, 7) = "01" Then
  38.                    swi60.Write(File.ReadAllText(txtfile.FullName))
  39.                End If
  40.                If Mid(txtfile.Name, 6, 7) = "02" Then
  41.                    swi62.Write(File.ReadAllText(txtfile.FullName))
  42.                End If
  43.                If Mid(txtfile.Name, 6, 7) = "03" Then
  44.                    swi63.Write(File.ReadAllText(txtfile.FullName))
  45.                End If
  46.            Next
  47.        Next
  48.        swcm.Close()
  49.        swgl.Close()
  50.        swi60.Close()
  51.        swi61.Close()
  52.        swi62.Close()
  53.        swi63.Close()
  54. End Sub
  55.  

Que opinas?

Como lo integro con tu código?

Gracias mil de nuevo.


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Eleкtro en 19 Octubre 2015, 14:43 pm
¿Y esto lleva aquí desde el 13 de octubre? xD lo siento por la tardanza, luego le doy un repaso y te comento.

saludos



EDITO:

Prueba de la siguiente manera, pero no se muy bien como tienes la estructura de carpetas y archivos así que tal vez tengas que cambiar los parámetros de la iteración de carpetas y/o archivos.

Lo he escrito al vuelo sin testearlo (es un coñazo volver a recrear la estructura de archivos y carpetas). De todas formas creo que este ejemplo te servirá para que lo consigas hacer por ti mismo.

Código
  1.    Public Sub FindAndMergeFiles(ByVal sourceDir As String)
  2.  
  3.        Const NameCM As String = "CM"
  4.        Const NameGL As String = "GL"
  5.        Const NameImp60 As String = "IMP6000"
  6.        Const NameImp61 As String = "IMP6001"
  7.        Const NameImp62 As String = "IMP6002"
  8.        Const NameImp63 As String = "IMP6003"
  9.  
  10.        Dim curFilename As String
  11.  
  12.        ' Itero cada directorio del directorio de origen.
  13.        For Each topDir As DirectoryInfo In New DirectoryInfo(sourceDir).
  14.                                                GetDirectories("*", SearchOption.TopDirectoryOnly)
  15.  
  16.            ' Itero de forma recursiva cada subdirectorio del directorio actual.
  17.            For Each subDir As DirectoryInfo In topDir.GetDirectories("*", SearchOption.AllDirectories)
  18.  
  19.                ' Itero de forma recursiva cada archivo de texto del directorio actual.
  20.                For Each txtfile As FileInfo In topDir.GetFiles("*.txt", SearchOption.AllDirectories)
  21.  
  22.                    If txtfile.Name.Equals(NameCM, StringComparison.OrdinalIgnoreCase) Then
  23.                        curFilename = NameCM
  24.  
  25.                    ElseIf txtfile.Name.Equals(NameGL, StringComparison.OrdinalIgnoreCase) Then
  26.                        curFilename = NameGL
  27.  
  28.                    ElseIf txtfile.Name.Equals(NameImp60, StringComparison.OrdinalIgnoreCase) Then
  29.                        curFilename = NameImp60
  30.  
  31.                    ElseIf txtfile.Name.Equals(NameImp61, StringComparison.OrdinalIgnoreCase) Then
  32.                        curFilename = NameImp61
  33.  
  34.                    ElseIf txtfile.Name.Equals(NameImp62, StringComparison.OrdinalIgnoreCase) Then
  35.                        curFilename = NameImp62
  36.  
  37.                    ElseIf txtfile.Name.Equals(NameImp63, StringComparison.OrdinalIgnoreCase) Then
  38.                        curFilename = NameImp63
  39.  
  40.                    Else
  41.                        curFilename = String.Empty
  42.  
  43.                    End If
  44.  
  45.                    If Not String.IsNullOrEmpty(curFilename) Then
  46.  
  47.                        Debug.WriteLine(topDir.FullName)
  48.                        Debug.WriteLine(subDir.FullName)
  49.                        Debug.WriteLine(txtfile.FullName)
  50.                        Debug.WriteLine(Path.Combine(topDir.FullName, curFilename))
  51.  
  52.                        Using sr As StreamReader = txtfile.OpenText
  53.                            File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)
  54.                        End Using
  55.  
  56.                    End If
  57.  
  58.                Next txtfile
  59.  
  60.            Next subDir
  61.  
  62.        Next topDir
  63.  
  64.    End Sub

Modo de empleo en el código fuente que compartí en la página anterior:
Código
  1. ...
  2. ' Muevo los directorios (si alguno) con formato de fecha específico (ej. "yyyyMMdd"), del directorio fuente, al directorio de destino.
  3. DateDirUtil.MoveDateDirectories(Me.year, monthNumber, DateDirUtil.DirNameFormat, Me.fdg.SelectedPath, dateDir)
  4.  
  5. ' Merge text files.
  6. DateDirUtil.FindAndMergeFiles(Me.fdg.SelectedPath)
  7. ...


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 19 Octubre 2015, 15:13 pm
Dale mi pana.

Gracias mil de nuevo....



Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 19 Octubre 2015, 16:33 pm
Saludos mi pana,

Estoy testeando la función y al principio me estaba dando error pues no hacía el merge de los archivos, entraba en cada carpeta, leia los archivos pero no entraba aqui:
Código:
 If Not String.IsNullOrEmpty(curFilename) Then

                        Debug.WriteLine(topDir.FullName)
                        Debug.WriteLine(subDir.FullName)
                        Debug.WriteLine(txtfile.FullName)
                        Debug.WriteLine(Path.Combine(topDir.FullName, curFilename))

                        Using sr As StreamReader = txtfile.OpenText
                            File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)
                        End Using

                    End If

El problema era que cuando hacía la comparación de los nombres de los archivos con las constantes:
Código:
If txtfile.Name.Equals(NameCM, StringComparison.OrdinalIgnoreCase) Then
                        curFilename = NameCM

La comparación no se daba pues el nombre del archivo es CM.TXT y no CM como estaba definido en las contantes; así que modifiqué esa porción del codigo y voilà funcona la función reune todos los archivos en uno solo.

Así quedó la porción final
Código:
        Const NameCM As String = "CM.TXT"
        Const NameGL As String = "GL.TXT"
        Const NameImp60 As String = "IMP6000.TXT"
        Const NameImp61 As String = "IMP6001.TXT"
        Const NameImp62 As String = "IMP6002.TXT"
        Const NameImp63 As String = "IMP6003.TXT"

Pero ahora me está dando este error:
An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll

Additional information: The process cannot access the file 'C:\Users\liderapp\Documents\Scripts\Octubre2015\CM.TXT' because it is being used by another process.
Eso sucede justo aqui:
Código:
 File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)

Cuando ya ha hecho el barrido de todas las carpetas.

Se debe a que el archivo ya está abierto y entonces al intentar abrirlo de nuevo da el error?

Gracias mil por el apoyo mi pana.


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 21 Octubre 2015, 14:09 pm
Saludos mi pana,

Estoy testeando la función y al principio me estaba dando error pues no hacía el merge de los archivos, entraba en cada carpeta, leia los archivos pero no entraba aqui:
Código:
 If Not String.IsNullOrEmpty(curFilename) Then

                        Debug.WriteLine(topDir.FullName)
                        Debug.WriteLine(subDir.FullName)
                        Debug.WriteLine(txtfile.FullName)
                        Debug.WriteLine(Path.Combine(topDir.FullName, curFilename))

                        Using sr As StreamReader = txtfile.OpenText
                            File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)
                        End Using

                    End If

El problema era que cuando hacía la comparación de los nombres de los archivos con las constantes:
Código:
If txtfile.Name.Equals(NameCM, StringComparison.OrdinalIgnoreCase) Then
                        curFilename = NameCM

La comparación no se daba pues el nombre del archivo es CM.TXT y no CM como estaba definido en las contantes; así que modifiqué esa porción del codigo y voilà funcona la función reune todos los archivos en uno solo.

Así quedó la porción final
Código:
        Const NameCM As String = "CM.TXT"
        Const NameGL As String = "GL.TXT"
        Const NameImp60 As String = "IMP6000.TXT"
        Const NameImp61 As String = "IMP6001.TXT"
        Const NameImp62 As String = "IMP6002.TXT"
        Const NameImp63 As String = "IMP6003.TXT"

Pero ahora me está dando este error:
An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll

Additional information: The process cannot access the file 'C:\Users\liderapp\Documents\Scripts\Octubre2015\CM.TXT' because it is being used by another process.
Eso sucede justo aqui:
Código:
 File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)

Cuando ya ha hecho el barrido de todas las carpetas.

Se debe a que el archivo ya está abierto y entonces al intentar abrirlo de nuevo da el error?

Gracias mil por el apoyo mi pana.

Investigando un poco en la nube; me sugieren que use este comando:

Código:
                Using loFileStream As System.IO.FileStream = New FileStream(lcFile, FileMode.Create)
                    loStreamWriter = New StreamWriter(loFileStream, cEncoding)
                    loStreamWriter.Write(cString)
                    loStreamWriter.Close()
                End Using

Q opinas al respecto?
Como lo adapto a nuestro script?

Sin mas,

Tu pana agradecido... jejejejejeje


Título: Re: Crear directorio del mes actual en BAT
Publicado por: Eleкtro en 23 Octubre 2015, 10:22 am
me está dando este error:
An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll

Additional information: The process cannot access the file 'C:\Users\liderapp\Documents\Scripts\Octubre2015\CM.TXT' because it is being used by another process.
Eso sucede justo aqui:
Código:
 File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)

Cuando ya ha hecho el barrido de todas las carpetas.

Se debe a que el archivo ya está abierto y entonces al intentar abrirlo de nuevo da el error?

Exactamente se debe a eso que has deducido. El archivo "...\topdir\xxx.txt" se procesa de forma inesperada en la iteración, es decir, se abre el archivo en modo lectura pero se intentan guardar/adjuntar datos en modo escritura. Esto sucede por que como escribí el código al vuelo cometí un pequeño fallo en esta linea:
Citar
Código
  1. ...
  2. For Each txtfile As FileInfo In topDir.GetFiles("*.txt", SearchOption.AllDirectories)
  3. ...

Modifica topDir por subDir

Lo siento por ese pequeño descuido. Con esa amodificación ya debería funcionarte como es esperado.



Investigando un poco en la nube; me sugieren que use este comando:

Código:
                Using loFileStream As System.IO.FileStream = New FileStream(lcFile, FileMode.Create)
                    loStreamWriter = New StreamWriter(loFileStream, cEncoding)
                    loStreamWriter.Write(cString)
                    loStreamWriter.Close()
                End Using

Q opinas al respecto?
Como lo adapto a nuestro script?

Una vez hayas corregido el fallo que comenté entonces no hay necesidad de hacer nada más. Aparte, en el código que has mostrado lo apropiado sería manejar la accesibilidad de un objeto StreamWriter para manipular texto, ya que un FileStream se utiliza más bien para escribir secuencias de bytes (y entonces tendrías que obtener los bytes del texto que quieres añadir), es completamente innecesario un FileStream en este escenario, además, le estás pasando el flag FileMode.Create el cual sobreescribirá el archivo en cada iteración que hagas, en lugar de adjuntar texto al archivo que ya estaba creado.

De todas formas te muestro como sería la adaptación de un FileStream, pero como ya digo es completamente innecesario:
Código
  1. ...
  2. Dim enc As Encoding = Encoding.Default
  3. Dim byteData As Byte()
  4.  
  5. Using sr As StreamReader = txtfile.OpenText
  6.  
  7.    Using fs As New FileStream(Path.Combine(topDir.FullName, curFilename),
  8.                               FileMode.Append, FileAccess.Write, FileShare.None, 128)
  9.  
  10.        byteData = enc.GetBytes(sr.ReadToEnd & Environment.NewLine)
  11.        fs.Write(byteData, 0, byteData.Length)
  12.  
  13.    End Using ' fs
  14.  
  15. End Using ' sr
  16. ...



Prueba el siguiente código. Lo he refactorizado bastante.

Código
  1. Public Sub MergeFiles(ByVal sourceDir As String)
  2.  
  3.    Dim fileNames As String() =
  4.        {
  5.            "CM.txt", "GL.txt",
  6.            "IMP6000.txt", "IMP6001.txt", "IMP6002.txt", "IMP6003.txt"
  7.        }
  8.  
  9.    Dim curFilename As String = String.Empty
  10.  
  11.    For Each topDir As DirectoryInfo In New DirectoryInfo(sourceDir).GetDirectories("*", SearchOption.TopDirectoryOnly)
  12.  
  13.        ' Elimino los archivos principales ("...\topDir\CM.txt", "...\topDir\GL.txt", etc...) de sesiones anteriores.
  14.        For Each txtfile As FileInfo In topDir.GetFiles("*.txt", SearchOption.TopDirectoryOnly)
  15.            If fileNames.Contains(txtfile.Name, StringComparer.OrdinalIgnoreCase) Then
  16.                txtfile.Delete()
  17.            End If
  18.        Next txtfile
  19.  
  20.        For Each subDir As DirectoryInfo In topDir.GetDirectories("*", SearchOption.AllDirectories)
  21.  
  22.            For Each txtfile As FileInfo In subDir.GetFiles("*.txt", SearchOption.AllDirectories)
  23.  
  24.                If fileNames.Contains(txtfile.Name, StringComparer.OrdinalIgnoreCase) Then
  25.  
  26.                    curFilename = fileNames.First(Function(filename) filename.Equals(txtfile.Name, StringComparison.OrdinalIgnoreCase))
  27.  
  28.                    Using sr As StreamReader = txtfile.OpenText
  29.  
  30.                        Using sw As New StreamWriter(Path.Combine(topDir.FullName, curFilename), append:=True, encoding:=Encoding.Default, bufferSize:=128)
  31.                            sw.WriteLine(sr.ReadToEnd)
  32.                        End Using ' sw
  33.  
  34.                    End Using ' sr
  35.  
  36.                End If
  37.  
  38.            Next txtfile
  39.  
  40.        Next subDir
  41.  
  42.    Next topDir
  43.  
  44. End Sub

NOTA: SI TE SURGEN MÁS DUDAS SOBRE VB.NET POR FAVOR CREA UN POST EN LA SECCIÓN DEDICADA A LA PLATAFORMA .NET
http://foro.elhacker.net/net-b62.0/

Saludos


Título: Re: Crear directorio del mes actual en BAT
Publicado por: elqueteconte en 23 Octubre 2015, 14:54 pm
Liiiisto...!

Hermano eres un duro en .net te felicito....

Mil gracias; ahora me toca ir a otra fase de este proyecto esto es apenas el comienzo, espero poder seguir con tu apoyo.

Dale creare los hilos en el foro que corresponde.

Gracias mil de nuevo mi pana.

Un abrazo y feliz fín de semana.



Título: Re: Crear directorio del mes actual en BAT
Publicado por: Eleкtro en 5 Agosto 2016, 11:58 am
Hola

 - Está prohibido revivir temas antiguos.
 - Es obligatorio formatear un bloque de código, ¡esto es un foro de programación!

Sigue las normas, por favor.

Tema Cerrado

Saludos