1 (изменено: moggiozzi, 2011-07-02 15:27:08)

Тема: CMD/BAT: Расфасовка файлов

Написал скриптик для расфасовки файлов по первому символу по папкам.

cmd /v:on
@echo off
for /f "delims=" %%i in ('DIR /AH/AS/AL/AR/AI/AA /b') DO (
    set temp=%%i    
    mkdir !temp:~0,1!
@rem    echo move "%%i" !temp:~0,1!
    move "%%i" !temp:~0,1!
)

Не дружит с именами, которые содержат символ '!' (возможно, можно еще кое-где подловить).
Как можно вылечить сей недостаток в скрипте, а не сторонними методами (типа группового переименования файлов, как я сделал)?
Если есть идеи по улучшению, высказывайте, функциональность нужная). (Например, мне не нравиться отбор файлов DIR /AH/AS/AL/AR/AI/AA /b).

Параметр /v : on включает связывание времени выполнения, из-за чего символ '!' начинает обрабатываться как "особый".
Если же запустить без него то переменная temp получает значение только один раз(а не при каждой итерации, как говорит интуиция(об этом написано в set /?)). Тогда не получается выделить один символ из переменной %%i, надо сделать что-то наподобие %i:~0,1%, но так не работает (значение переменной берется %%i).
'DIR /AH/AS/AL/AR/AI/AA /b' заменяется 'DIR /A-D /B'.

2

Re: CMD/BAT: Расфасовка файлов

Посмотри Переупорядочить папки по первым буквам их имён

3

Re: CMD/BAT: Расфасовка файлов

После блужданий по форуму родилось вот такое решение(и не надо запускать cmd с какими-то ключиками):

@ECHO OFF
for /f "delims=" %%i in ('DIR /A-D /b') DO (
    if "%%i" NEQ "ScriptName.bat" CALL :movFunc "%%i"
)
GOTO:EOF

:movFunc
    set fileName=%~1%
    set dirName=%fileName:~0,1%
    md %dirName%
    move "%fileName%" "%dirName%"

Из найденных недостатков: не дружит с именами содержащими символ '&'.

4

Re: CMD/BAT: Расфасовка файлов

Стоило немного поиграться с кавычками и символ '&' съедается. Осталось победить символ процента)

@ECHO OFF
for /f "delims=" %%i in ('DIR /A-D /b') DO (
    if "%%i" NEQ "run.bat" CALL :movFunc "%%i"
)
GOTO:EOF

:movFunc
    set fileName=%1%
    set dirName="%fileName:~1,1%"
    md %dirName%
    move %fileName% %dirName%

5

Re: CMD/BAT: Расфасовка файлов

а setlocal отменили ?
да и вполне живуча конструкция типа set "x=%%~i"

Я конечно далек от мысли... (с)