Пакетный процесс DOS для перемещения файлов в соответствующие папки

Я хочу написать пакетный процесс DOS, который будет проходить через мой каталог и перемещать все файлы *.txt в папку назначения, начиная с первого символа файлов txt.

Пример.
abc.txt переместится в папку "a"
def.txt переместится в папку "d"
и так далее...


person Murtaza Mandvi    schedule 07.08.2009    source источник
comment
Для уточнения, вы имеете в виду пакетный файл для использования в чистом DOS или в командной строке под окнами?   -  person Synetech    schedule 08.08.2009


Ответы (6)


Из командной строки:

for %i in (*.txt) do (set FOLDER=%i & move %i %FOLDER:~0,1%)

В пакетном файле вам придется удвоить %, например:

for %%i in (*.txt) do (set FOLDER=%%i & move %%i %FOLDER:~0,1%)
person lavinio    schedule 07.08.2009
comment
Добавление & если не существует %FOLDER:~0,1% md %FOLDER:~0,1% непосредственно перед словом move имеет решающее значение, иначе файлы будут перемещены в файл с именем a, b и т. д. Но это работает. Также завершите команду перемещения обратной косой чертой в пути, например ** %FOLDER:~0,1%\ **, чтобы быть в безопасности. - person Jay; 08.09.2009

Я думаю, что суть проблемы в том, чтобы извлечь первую букву.

вы можете использовать ~ char для извлечения первой буквы имени файла

set str=filename
echo %str:~0,1%
f
person Jonathan    schedule 07.08.2009

Вы можете использовать команду biterscripting chex (извлечение символов) для извлечения первого символа имени файла. Вот сценарий. Предположим, что ваши файлы находятся в папке C:\My Directory.

# Script move1.txt
# Change directory to My Directory.
cd "C:\My Directory"

# Collect a list of *.txt files.
var str list ; lf -n "*.txt" > $list

# Go thru files one by one.
while ($list <> "")
do

    # Get the next file.
    var str file ; lex "1" $list > $file

    # $file now has full path of a found *.txt file. Get just the file name.
    var str filename ; stex -p "^/^l[" $file > $filename

    # $filename has just the file name. Get the first character.
    var str firstchar ; chex -p "1" $filename > $firstchar

    # $firstchar now has the first char of file name. The folder where we
    # want to move this file is, then, C:\Destimation Folder\$firstchar .
    var str destfolder ; set $destfolder = "C:\Destination Folder\"+$firstchar

    # Move $file to $destfolder.
    system move ("\""+$file+"\"") ("\""+$destfolder+"\"")

done

Скрипт находится в битерскриптинге ( http://www.biterscripting.com ). Чтобы попробовать, сохраните скрипт как C:\Scripts\move1.txt, запустите битерскриптинг, введите следующую команду.

script move1.txt

Если вам нужно периодически запускать сценарий, запланируйте следующую команду в планировщике задач.

"C:\biterScripting\biterScripting.exe" "move1.txt"

Я не тестировал скрипт, проверьте его на примерах файлов. Убедитесь, что вы изменили значения "C:\My Directory" и "C:\Destination Folder" на правильные значения. Всегда используйте двойные кавычки с именами файлов и путями.

person Community    schedule 26.08.2009

Как насчет этой одной строки:

общая форма: для %a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) делать, если не существует %a\nul md %a & если существует %a* переместить %a* %a

этот мод будет делать только файлы txt (согласно OP): ... если существуют %a*.txt переместите %a*.txt %a

или можно улучшить это в летучей мыши, чтобы сделать «... если существует %%a*%1 переместите %%a*%1 %%a», чтобы разрешить сопоставление расширений в командной строке; что, вероятно, потребует точки в %1 (не хочется тестировать это прямо сейчас. Если бы это было проблемой, вы всегда могли бы использовать if%1!==! для выбора между общей формой и специфичной для %1 с уже поставленной точкой.

конечно, %a для командной строки, а для летучей мыши удваивайте %s как обычно (%a -> %%a).

это решение позволит избежать ошибок с пробелами в именах файлов, но вы получите подкаталог для каждой буквы (даже если не было файлов, начинающихся с этой конкретной буквы).

и теперь мне потребовалось больше времени, чтобы напечатать это, чем напечатать исходную строку выше... :-)

person Richard    schedule 22.09.2011

Подсчитать все файлы TSV в текущей папке.

for /f "delims=|" %%f in ('dir *.tsv /b') do (
echo %%~nf
findstr /R /N "^" %%f | find /C ":"
)
person SarjanWebDev    schedule 03.12.2012

copy sourcepath\a*.txt destinationpath\a

скопировать исходный путь\b*.txt целевой путь\b

person Kevin LaBranche    schedule 07.08.2009
comment
Мне нужен автоматизированный скрипт, который проходит через каталог и делает именно это сам :) - person Murtaza Mandvi; 08.08.2009
comment
Не говоря уже о том, что будет копировать, а не перемещать - person Snekse; 25.06.2012