[Batch] almacenar nombres de carpetas en variables (solucionado)

Iniciado por corax, 17 Junio 2009, 16:49 PM

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

corax

buenas a todos

necesito hacer un fragmento de código en batch que busque los nombres de las carpetas (solo las carpetas, sin contar las subcarpetas), de la unidad que se le indique, y que almacene cada nombre en una variable para poder trabajar con ellas más adelante

después de pasarme un buen rato intentando hacerlo sin éxito al final me he quedado sin ideas, ¿a alguien se le ocurre algo?  :-\
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

Darioxhcx

cd %homedrive%
for /d %%x in ( * ) do echo %%x

fijate si asi te sirve

do set %%x=%contador?%

suerte
un saludo

corax

sí, me ha sevido... en parte, gracias Dario  :)

el código reconoce los nombres de las carpetas que están en "%homedrive%\", el problema viene cuando intento guardar cada nombre como una variable distinta para usarlas posteriormente en el código

lo que puedo hacer con eso es almacenar los nombres en un archivo de texto y hacer un código que lea cada línea, pero me gustaría poder ahorrarme el paso intermedio, es decir, en vez de escribir los nombres de la carpeta en un archivo de texto, leer el archivo y asignar cada línea a una variable, me gustaría poder asignar directamente cada nombre a una variable, y ahí ya sí que no tengo ni idea de como hacerlo, que es el principal problema
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

leogtz

A ver, suponiendo que estamos en la ruta:
X:\documents and settings

Y queremos almacenar las carpetas en variables por separado:
Código (dos) [Seleccionar]
@echo off
cd /d "%homedrive%\documents and settings"
setlocal enabledelayedexpansion
for /f "tokens=*" %%_ in ('dir /b /ad') do (
set /a "contador+=1"
set "linea!contador!=%%~dpn_"
)
set linea
pause>nul
exit /b 0

Salida:
linea1=C:\Documents and Settings\Administrador
linea2=C:\Documents and Settings\All Users
linea3=C:\Documents and Settings\Default User
linea4=C:\Documents and Settings\LocalService
linea5=C:\Documents and Settings\NetworkService

Ya puedes darle el uso que quieras a las variables.

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

corax

#4
Muchas gracias Leo  :)

Solo me queda una duda, que seguro que es una tontería, pero no acabo de entender:
este código muestra por pantalla al ejecutarse estas líneas de texto (en tu caso):

linea1=C:\Documents and Settings\Administrador
linea2=C:\Documents and Settings\All Users
linea3=C:\Documents and Settings\Default User
linea4=C:\Documents and Settings\LocalService
linea5=C:\Documents and Settings\NetworkService


Si yo quisiera por ejemplo cambiar de nombre la primera carpeta, o moverla, o quisiera hacerlo con la segunda... ¿cómo debería hacerlo? :-\
Es decir, ¿sería algo como ren "%homedrive%\documents and settings\%variable1% NuevoNombre"?

Por otra parte, ¿qué debo hacer para que no se muestre por pantalla la información? Es un código para automatización de tareas, por lo que intento que el usuario solo tenga que interactuar con el bat en caso de estricta necesidad.

Una vez más, gracias por tu tiempo.  :)
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

leogtz

Puedes acceder a las carpetas asi:
!linea1!
!linea2!
...

ó así:
%linea1%


Puedes hacer lo que quieras con ellas, lo que harías normalmente con cualquier variable.

CitarPor otra parte, ¿qué debo hacer para que no se muestre por pantalla la información? Es un código para automatización de tareas, por lo que intento que el usuario solo tenga que interactuar con el bat en caso de estricta necesidad.

Para evitar que se visualice información, puedes redirigir la salida a NULL:
Ejemplo:

C:\>taskkill -f -im notepad.exe
Correcto: se terminó el proceso "notepad.exe" con PID 2340.

C:\>notepad

C:\>taskkill -f -im notepad.exe > nul 2>&1

C:\>


Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

corax

Muchísimas gracias, Leo  :)
El código es justo lo que andaba buscando.

En cuanto a lo de que no muestre información por pantalla, me refería a que no mostrase lo de

linea1=C:\Documents and Settings\Administrador
linea2=C:\Documents and Settings\All Users

etc, pero ya he conseguido hacerlo  :)

Otra vez, muchas gracias!
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.