Cambiar una letra de unidad extraible en batch

Iniciado por Zzz01Breikoft, 27 Septiembre 2014, 03:36 AM

0 Miembros y 1 Visitante están viendo este tema.

Zzz01Breikoft

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 (dos) [Seleccionar]
Title=Zzz01 Breikoft
color cf
setlocal Enabledelayedexpansion
for /F "tokens=1-9* delims=:\ " %%a in ('fsutil fsinfo drives') do (
Set unidad=%%b & Call :verificar
Set unidad=%%c & Call :verificar
Set unidad=%%d & Call :verificar
Set unidad=%%e & Call :verificar
Set unidad=%%f & Call :verificar
Set unidad=%%g & Call :verificar
Set unidad=%%h & Call :verificar
Set unidad=%%i & Call :verificar
Set unidad=%%j & Call :verificar
)
goto :menu
:Verificar
fsutil fsinfo drivetype !unidad:~-0,1!: | findstr /s "fija extra"
If %errorlevel% EQU 0 (
set /a num+=1
Set Unidad!num!=!unidad:~-0,1!:
goto:eof
) ELSE (
goto:eof
)
:Menu
cls
echo+
echo ========================!num! UNIDADES ENCONTRADAS==========================
echo =======================================================================
echo ======================UNIDADES !unidad1!!Unidad2!!Unidad3!!Unidad4!!Unidad5!!Unidad6!!Unidad7!!Unidad8!!Unidad9!DETECTADAS==============================
echo =======================================================================
echo =====================PRESIONE LA LETRA DE LA UNIDAD====================
set /p opcion=
if exist %opcion::=%: (
goto :scriptcarpeta
) ELSE (
echo+ & echo No se encuentra la unidad %opcion::=%:...
ping -n 2 LOCALHOST >nul
cls
goto :menu
)
:scriptcarpeta
Setlocal Disabledelayedexpansion
echo =======================================================================
echo =======================================================================
echo ===========================CREANDO CARPETAS============================
md %opcion::=%:\Trabajos
md %opcion::=%:\Sistema
md %opcion::=%:\Trabajos\Im genes
md %opcion::=%:\Trabajos\Videos
md %opcion::=%:\Trabajos\JDIFF
md %opcion::=%:\Trabajos\JDIFF\DATA
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 1"
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 2"
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 3"
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 4"
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 5"
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 6"
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 3"\01.03.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 3"\02.03.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 3"\03.03.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 4"\01.04.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 4"\02.04.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 4"\03.04.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 5"\01.05.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 5"\02.05.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 5"\03.05.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 6"\01.06.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 6"\02.06.00
md %opcion::=%:\Trabajos\JDIFF\DATA\"Launcher 6"\03.06.00
md %opcion::=%:\Sistema\"About myself"
md %opcion::=%:\Sistema\Programas
md %opcion::=%:\Sistema\If_Then_History
md %opcion::=%:\Sistema\M£sica
md %opcion::=%:\Sistema\Pantalla
md %opcion::=%:\Sistema\Temp
md %opcion::=%:\Sistema\"About myself"\COMMANDS
md %opcion::=%:\Sistema\"About myself"\"DATA DUMPS"
md %opcion::=%:\Sistema\"About myself"\UNDOS
cd %opcion::=%:\Sistema
attrib "About myself" +r +s +h
attrib Temp +r +s +h
cd %opcion::=%:\
attrib Sistema +r +s +h

Eleкtro

#1
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)





Cita de: Zzz01Breikoft en 27 Septiembre 2014, 03:36 AMya 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!








Zzz01Breikoft

Muchas gracias! me ayudaste mucho, creí que mi código estaba un poco mal :3

Eleкtro

#3
Cita de: Zzz01Breikoft en 27 Septiembre 2014, 04:10 AMcreí 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 (DOS) [Seleccionar]
@ECHO OFF & (CHCP 1252)1>NUL

:: Enumeración 'DriveType' de la Class 'Win32_LogicalDisk' de la Interface WMI.
:: Documentación: http://msdn.microsoft.com/en-us/library/aa394173%28v=vs.85%29.aspx
Set /A "HardDisk=3"
Set /A "RemovableDisk=2"

:: Cambio el directorio de trabajo actual.
PUSHD "%SystemRoot%\System32"

:: Ejecuto una Query al comando externo WMIC.exe y filtro la salida resultante.
For /F "Delims= " %%# In (
  '.\WBEM\WMIC.exe "logicaldisk" "get" "caption"^,"drivetype" ^| .\FindStr.exe "%HardDisk% %RemovableDisk%"'
) Do (
  :: Obtengo las letras de los dispositivos conectados.
  Call Set "DRIVES=%%DRIVES%%%%#"
)

:: Simple Debug.
REM Echo [Debug] Unidades encontradas: %DRIVES%

:: Elimino la letra de unidad desde la que se inició este Script;
:: ya que la letra de la unidad activa (del SO) no se podrá modificar.
:: Doy por hecho que se ejecutó desde la unidad activa del SO, de lo contrario esto necesita un retoque.
Call Set "DRIVES=%%DRIVES:%~d0=%%"

:: Reemplazo el caracter ":" del resto de letras por un caracter de "espacio";
:: de esta manera puedo usar el delimitador por defecto ("espacio") en un For.
Set "DRIVES=%DRIVES::= %"

:: Por último, proceso cada letra de unidad para crear variables de manera dinámica.
Set "INPUT="
Set /A "Count=0"

For %%D in (%DRIVES%) Do (

  Set /A "Count+=1"             & REM Incremento el contador.
  Call Set "_%%Count%%=%%D"     & REM Seteo la variable con el número del contador.
  Call Set "INPUT=%%INPUT%%%%D" & REM Asigno la letra de unidad a la variable.

)

:: Pregunto al usuario por una letra de unidad.
".\Choice.exe" /C "%INPUT%" /M "Elige una letra de unidad"
Set /A "CHOICE=%ErrorLevel%"   & REM Guardo el resultado.
Call Set "DRIVE=%%_%CHOICE%%%" & REM Seteo la letra de unidad elegida.

:: Y manejo la unidad de la forma que se desee:
Echo.
Call Echo Listado de carpetas: de la unidad "%DRIVE%:\" | .\More.com
Dir /B /AD "%DRIVE%:\*"

:: Vuelvo al directorio de trabajo inicial.
POPD

Pause&Exit /B 0


Saludos