Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Zzz01Breikoft en 27 Septiembre 2014, 03:36 am



Título: Cambiar una letra de unidad extraible en batch
Publicado por: Zzz01Breikoft en 27 Septiembre 2014, 03:36 am
Hola, soy novato en esto de programación y pues estoy aprendiendo un poco y leyendo libros acerca de todo esto, también estoy llendo a cursos pero apenas estoy empezando, lo que pasa es que estoy creando un programa en batch que lo que hace es simple (nada nuevo)

Primero me pregunta la unidad extraíble a la que quiero yo crear carpetas y de ahí no hace nada mas

Dado que no se como rayos se hace eso, entonces estuve investigando un poco ejemplos de código de fuentes y me encontré algunos que me sirvieron para programa este programa, me ayudo mucho esta página (o foro o lo que sea que se le llame)

Sin embargo ahora lo que quiero es que de la unidad en la que esta trabajando (por ejemplo la F:\) me la cambie a la unidad D:\ ya se que con cmd se hace con diskpart pero en batch sé que no será lo mismo, entonces pues ayudenme en mi programita, soy novato pero entenderé lo que estoy copiando

Aquí está mi código de fuente: (el "scriptcarpeta" fue lo único que hice yo)

Código
  1. Title=Zzz01 Breikoft
  2. color cf
  3. setlocal Enabledelayedexpansion
  4. for /F "tokens=1-9* delims=:\ " %%a in ('fsutil fsinfo drives') do (
  5. Set unidad=%%b & Call :verificar
  6. Set unidad=%%c & Call :verificar
  7. Set unidad=%%d & Call :verificar
  8. Set unidad=%%e & Call :verificar
  9. Set unidad=%%f & Call :verificar
  10. Set unidad=%%g & Call :verificar
  11. Set unidad=%%h & Call :verificar
  12. Set unidad=%%i & Call :verificar
  13. Set unidad=%%j & Call :verificar
  14. )
  15. goto :menu
  16. :Verificar
  17. fsutil fsinfo drivetype !unidad:~-0,1!: | findstr /s "fija extra"
  18. If %errorlevel% EQU 0 (
  19. set /a num+=1
  20. Set Unidad!num!=!unidad:~-0,1!:
  21. goto:eof
  22. ) ELSE (
  23. goto:eof
  24. )
  25. :Menu
  26. cls
  27. echo ========================!num! UNIDADES ENCONTRADAS==========================
  28. echo =======================================================================
  29. echo ======================UNIDADES !unidad1!!Unidad2!!Unidad3!!Unidad4!!Unidad5!!Unidad6!!Unidad7!!Unidad8!!Unidad9!DETECTADAS==============================
  30. echo =======================================================================
  31. echo =====================PRESIONE LA LETRA DE LA UNIDAD====================
  32. set /p opcion=
  33. if exist %opcion::=%: (
  34. goto :scriptcarpeta
  35. ) ELSE (
  36. echo+ & echo No se encuentra la unidad %opcion::=%:...
  37. ping -n 2 LOCALHOST >nul
  38. cls
  39. goto :menu
  40. )
  41. :scriptcarpeta
  42. Setlocal Disabledelayedexpansion
  43. echo =======================================================================
  44. echo =======================================================================
  45. echo ===========================CREANDO CARPETAS============================
  46. md %opcion::=%:\Trabajos
  47. md %opcion::=%:\Sistema
  48. md %opcion::=%:\Trabajos\Im genes
  49. md %opcion::=%:\Trabajos\Videos
  50. md %opcion::=%:\Trabajos\JDIFF
  51. md %opcion::=%:\Trabajos\JDIFF\DATA
  52. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 1"
  53. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 2"
  54. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 3"
  55. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 4"
  56. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 5"
  57. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 6"
  58. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 3"\01.03.00
  59. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 3"\02.03.00
  60. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 3"\03.03.00
  61. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 4"\01.04.00
  62. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 4"\02.04.00
  63. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 4"\03.04.00
  64. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 5"\01.05.00
  65. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 5"\02.05.00
  66. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 5"\03.05.00
  67. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 6"\01.06.00
  68. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 6"\02.06.00
  69. md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 6"\03.06.00
  70. md %opcion::=%:\Sistema\"About myself"
  71. md %opcion::=%:\Sistema\Programas
  72. md %opcion::=%:\Sistema\If_Then_History
  73. md %opcion::=%:\Sistema\M£sica
  74. md %opcion::=%:\Sistema\Pantalla
  75. md %opcion::=%:\Sistema\Temp
  76. md %opcion::=%:\Sistema\"About myself"\COMMANDS
  77. md %opcion::=%:\Sistema\"About myself"\"DATA DUMPS"
  78. md %opcion::=%:\Sistema\"About myself"\UNDOS
  79. cd %opcion::=%:\Sistema
  80. attrib "About myself" +r +s +h
  81. attrib Temp +r +s +h
  82. cd %opcion::=%:\
  83. attrib Sistema +r +s +h


Título: Re: Cambiar una letra de unidad extraible en batch
Publicado por: Eleкtro en 27 Septiembre 2014, 04:01 am
1) Las preguntas sobre Scripts van en esta sección.

2) Los códigos deben publicarse con el formato de código correcto (puedes leer mi firma si no te aclaras)




ya se que con cmd se hace con diskpart pero en batch sé que no será lo mismo, entonces pues ayudenme en mi programita, soy novato pero entenderé lo que estoy copiando

Lo que conoces como CMD es Batch, y lo que conoces como Batch es CMD, el proceso CMD.exe es el intérprete del "lenguaje" Batch (lenguaje entre comillas, porque debido a su simpleza no se considera como tal),
así pues, la CMD (o Command Prompt) es la aplicación encargada de procesar las órdenes/instrucciones que contiene un Script escrito en Batch (o Batch-Script), no hay más de lo que ya hayas visto usando la consola.

Por lo tanto el método a realizar es el mismo, usando la herramienta Diskpart.exe (y también puedes hacerlo con MountVol.exe), ya que Batch debe recurrir a este tipo de aplicaciones externas (o "comandos externos") para ofrecer algún tipo de funcionalidad útil.

Doy por hecho que ya sabes usar diskpart (o que de lo contrario vas a buscar en Google, o a mirar la ayuda del comando Diskpart.exe /? ,  MountVol.exe /?) y no necesitas más ayuda al respecto sabiendo que el procedimiento es exactamente el mismo en Batch, porque te estas refiriendo a eso al hablar de la CMD (en este caso).

Saludos!


Título: Re: Cambiar una letra de unidad extraible en batch
Publicado por: Zzz01Breikoft en 27 Septiembre 2014, 04:10 am
Muchas gracias! me ayudaste mucho, creí que mi código estaba un poco mal :3


Título: Re: Cambiar una letra de unidad extraible en batch
Publicado por: Eleкtro en 27 Septiembre 2014, 05:25 am
creí que mi código estaba un poco mal :3

Si, estás usando malas practicas, los Strings deberías encerrarlos de principio a fin, no solamente las partes que contengan espacios, ya que resulta confuso, es bastante irreconocible en cualquier editor de texto (para programadores, no el notepad), y hacer eso no te asegura que no vayas a cometer equivocaciones en el resto del String.

Aparte de eso, si tu intención es crear una variable por cada unidad encontrada entonces no es necesario setear 9 variables especificas, puedes crear las variables que hagan falta en tiempo de ejecución, o crear un menú con ellas, etc.

Te escribo un ejemplo:
Código
  1. @ECHO OFF & (CHCP 1252)1>NUL
  2.  
  3. :: Enumeración 'DriveType' de la Class 'Win32_LogicalDisk' de la Interface WMI.
  4. :: Documentación: http://msdn.microsoft.com/en-us/library/aa394173%28v=vs.85%29.aspx
  5. Set /A "HardDisk=3"
  6. Set /A "RemovableDisk=2"
  7.  
  8. :: Cambio el directorio de trabajo actual.
  9. PUSHD "%SystemRoot%\System32"
  10.  
  11. :: Ejecuto una Query al comando externo WMIC.exe y filtro la salida resultante.
  12. For /F "Delims= " %%# In (
  13.   '.\WBEM\WMIC.exe "logicaldisk" "get" "caption"^,"drivetype" ^| .\FindStr.exe "%HardDisk% %RemovableDisk%"'
  14. ) Do (
  15.   :: Obtengo las letras de los dispositivos conectados.
  16.   Call Set "DRIVES=%%DRIVES%%%%#"
  17. )
  18.  
  19. :: Simple Debug.
  20. REM Echo [Debug] Unidades encontradas: %DRIVES%
  21.  
  22. :: Elimino la letra de unidad desde la que se inició este Script;
  23. :: ya que la letra de la unidad activa (del SO) no se podrá modificar.
  24. :: Doy por hecho que se ejecutó desde la unidad activa del SO, de lo contrario esto necesita un retoque.
  25. Call Set "DRIVES=%%DRIVES:%~d0=%%"
  26.  
  27. :: Reemplazo el caracter ":" del resto de letras por un caracter de "espacio";
  28. :: de esta manera puedo usar el delimitador por defecto ("espacio") en un For.
  29. Set "DRIVES=%DRIVES::= %"
  30.  
  31. :: Por último, proceso cada letra de unidad para crear variables de manera dinámica.
  32. Set "INPUT="
  33. Set /A "Count=0"
  34.  
  35. For %%D in (%DRIVES%) Do (
  36.  
  37.   Set /A "Count+=1"             & REM Incremento el contador.
  38.   Call Set "_%%Count%%=%%D"     & REM Seteo la variable con el número del contador.
  39.   Call Set "INPUT=%%INPUT%%%%D" & REM Asigno la letra de unidad a la variable.
  40.  
  41. )
  42.  
  43. :: Pregunto al usuario por una letra de unidad.
  44. ".\Choice.exe" /C "%INPUT%" /M "Elige una letra de unidad"
  45. Set /A "CHOICE=%ErrorLevel%"   & REM Guardo el resultado.
  46. Call Set "DRIVE=%%_%CHOICE%%%" & REM Seteo la letra de unidad elegida.
  47.  
  48. :: Y manejo la unidad de la forma que se desee:
  49. Call Echo Listado de carpetas: de la unidad "%DRIVE%:\" | .\More.com
  50. Dir /B /AD "%DRIVE%:\*"
  51.  
  52. :: Vuelvo al directorio de trabajo inicial.
  53.  
  54. Pause&Exit /B 0

Saludos