almacenar el nombre de un directorio en una variable

Iniciado por vikyBatch, 15 Julio 2015, 00:38 AM

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

vikyBatch

buenas a todos

necesito hacer un fragmento de código en batch que busque los nombres de las carpetas ( las subcarpetas que contengan *_C_*) y que almacene el nombre en una variable para poder trabajar con ella, necesito  almacenar el nombre  para  poder modificarlo en caso de que  tenga caracteres especiales  y  anadir ese nombre a cada fichero de la subcarpeta.

después de pasarme un buen rato intentando hacerlo sin éxito al final me he quedado sin ideas, lo estoy intentando con un for, pero  ni modo, ¿a alguien se le ocurre algo?

mi código:

Código (dos) [Seleccionar]
MKDIR "D:\Documents\testbatch\temp"  
SET TEMPDossier="D:\Documents\testbatch\temp"  
:Check  
CD /D D:\Documents\testbatch  
FOR /D %%x in (*_C_* ) do (  
CALL :fct_log_Texte INFO  " dossier disponible %%x"  
setlocal enabledelayedexpansion  
SET VarDossier= %%x  
ECHO !VarDossier!  
SET rename=!VarDossier!  
echo %rename%  
:: Quote the variable and remove the !  
Set rename="%rename:!=%"
Setlocal EnableDelayedExpansion
For %%J In (^| ^& ^< ^> ^^ + ^( ^) \ / . @ # $ { } [ ] ' ; : , ? ` ^%% ^") Do (Set rename=!rename:%%J=!)
FOR /F %%i in ('dir /b " D:\Documents\testbatch\%VarDossier%\*"') do (
MOVE /Y " D:\Documents\testbatch\%VarDossier%\%%i" "%TEMPDossier%\%rename%_%%i"
dir /b /a " D:\Documents\testbatch\%VarDossier%\*" | >nul findstr "^" && (call :DirectoryEmpty) || (call :Check)

Eleкtro

#1
1. Usa las etiquetas para insertar código, lee mi firma.

2. ¿Qué problema tienes exactamente con el código que has mostrado?, intenta ser específico.

3. ¿Qué hay de los métodos fct_log_Texte y DirectoryEmpty?, no aparecen en el código.

4. Por defecto Windows no permite utilizar ciertos caracteres especiales al nombrar directorios/archivos, puedes descartar muchos caracteres innecesarios del For para aumentar el rendimiento.

5. El último For del código que has mostrado, tiene la agrupación abierta, por lo que dará error de sintaxis.

Prueba de la siguiente manera:
@Echo OFF & Setlocal EnableDelayedExpansion

Set "sourceDirPath=C:\Users\"
Set "dirNamePattern=_C_"
(MKDir "%srcDir%")2>Nul


For /D /R "C:\users" %%# In ("*%dirNamePattern%*") Do (

(Echo "%%~nx#" | findstr "[\+\(\)\@\#\$\{\}\[\]\'\;\,\`\&\%%\^\.]")1>Nul 2>&1 && (
Call :DirtyWork "%%~nx#" "%%~f#"
)

)

Pause&Exit /B 0


:DirtyWork :: %1=Directory Name, %2=Directory Path

Set "renamedName=%~1"

For %%# In ("+","(",")","@","#","$","{","}","[","]","'",";",",","`","&","%%","^") Do (
Set "renamedName=!renamedName:%%~n#=!"
) & Set "renamedName=!renamedName:.=!"

Echo: Dir Name: "%~1"
Echo: Rename  : "!renamedName!"
Goto :EOF


Saludos!








vikyBatch

#2
muchas gracias   por respoder , en realidad  no está todo  el código.
Aclaraciones:
fct_log_Texte y DirectoryEmpty son 2 funciones, el primero  nos permite crear  un log  y  el segundo cunao hacer alggo específico cuando la carpeta está vacia.
zipper&tom, es  otra funcion que  hace  otra cosa.

mi intención es, desde un carpeta concreta buscar  todas lass subcarpetas que contenga  una *_C_*  , vérificar que no tengan caracteres speciales como nombre de subcarpeta, en el caso de contener algún caracter  extraño , suprimirlo los  caracteres especiales del nombre de supcartepa,  luego  utlizar ese nombre (modificado o no ) y añadir el  nombre a todos  sus ficheros.
cuando las  variables están en  duro  funciona, pero  cuando  quiero almacenar el valor  en una variable desde  un for, no puedo, mis  variables   "set VarDossier=%%x" y " SET rename=%VarDossier%" están vacias



Eleкtro

Cita de: vikyBatch en 15 Julio 2015, 08:02 AMcuando  quiero almacenar el valor  en una variable desde  un for, no puedo, mis  variables   "set VarDossier=%%x" y " SET rename=%VarDossier%" están vacias

Dentro del bloque de un For, debes hacer uso de la expansiónd e variables:
Set "rename=!VarDossier!"

O en su defecto, con el comando Call:
Call Set "rename=%%VarDossier%%"

Slaudos








vikyBatch

Muchas gracias  por los consejos  voy a probar.