2015-10-09 2 views
0

Итак, у меня есть пакетный файл ниже.Пакетный файл Перетаскивание нескольких файлов из одной папки в новую папку Ошибка

@ECHO OFF 
    FOR %%I IN (.) DO SET FolderName=%%~nxI 
    MKDIR "C:\%FolderName%" 
    for %%i in (%*) do (
     move "%%~i" "C:\%FolderName%" 
    ) 

Так что, когда я перетащить несколько файлов в пакетном файл, он будет носить имя папки, которая содержит файлы, которые я перетаскивание и сделать новую папку в C: \ с тем же именем а затем переместите файлы в новую папку на C: \

Пример: папка, в которой хранятся файлы, которые я хочу переместить, называется Shop. Затем папка Магазин находится в

... \ земля \ колокол \ башня \ магазин

Использование пакетного файла будет создать новую папку с названием магазина на C: \

Пример

C: \ Shop

Пакетные файлы работают, когда я перетаскиваю около 100 файлов одновременно. Проблема в том, что когда я перетаскиваю 300 файлов одновременно, он возвращает ошибку, в которой говорится: «Имя файла или расширение слишком длинное». Я могу перемещать файлы вручную, поэтому я знаю, что это не может быть причиной слишком длинным именем файла.

Тогда я сделал новый командный файл, думая, может быть, это проблема с командой move или мой цикл for. Поэтому я написал командный файл ниже.

@echo off 
    FOR %%I IN (.) DO SET FolderName=%%~nxI 
    MKDIR "C:\%FolderName%" 
    MOVE "%cd%\*.*" "C:\%FolderName%" 

Теперь второй командный файл работает примерно так же, как и первый командный файл. Просто со вторым командным файлом мне нужно только перетащить один файл из папки, которую я хочу переместить, и он переместит все файлы в первой папке в новую папку в C: \, даже если первая папка была 1000 файлов.

Мой вопрос: Почему первый пакетный файл выходит из строя, если я перетаскиваю слишком много файлов одновременно. Использование второго командного файла, так что это не может быть из-за команды move или не так ли? Поскольку я перемещаю все файлы из одной папки в другую, второй пакетный файл соответствует моей потребности, и мне было интересно, будут ли проблемы со вторым командным файлом или лучший способ сделать это.

ответ

1

Когда вы перетаскиваете файлы в файл Bat, ваш Bat фактически вызывается так, как если бы вы его вызвали в командной строке. Так что, если вы перетащите три файла на вашем Bat т.е.

Testfile.txt 
Testfile.md 
Testfile.jpg 

Тогда на самом деле ваш Bat называется так:

C:\MyBatch.BAT Testfile.txt Testfile.md Testfile.jpg 

Если вы вызываете больше это, очевидно, что-то вроде:

C:\MyBatch.BAT Testfile.txt Testfile.md Testfile.jpg Testfile01.txt Testfile01.md Testfile01.jpg Testfile02.txt Testfile02.md Testfile02.jpg Testfile03.txt Testfile03.md Testfile03.jpg Testfile04.txt Testfile04.md Testfile04.jpg Testfile05.txt Testfile05.md Testfile05.jpg etc... 

Ах, вы можете прочитать остальную часть строки? Хорошо, это не так много, как 1000 файлов, но получите смысл, какая разница в ваших скриптах. Ваш буфер командной строки не сможет захватить такой объем ввода.

Фактически размер количества символов, которые вы можете ввести в командной строке, немного отличается от системы к системе, но в winXP было что-то вроде 8k, я считаю, что он все тот же.

http://support.microsoft.com/kb/830473 < - это могло бы помочь в большей степени касательно макс.

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

dir /b >filelist.txt 

так теперь, когда у вас есть этот список файлов, то вы просто прочитать текстовый файл построчно:

for /f "delims=" %%i in (filelist.txt) do echo D|xcopy "C:\FolderName\%%i" "c:\temp\%%i" /i /z /y 

так что это будет на самом деле читать ваш файл list.txt и будет (для каждого файла в списке) нажмите клавишу D и перетащите ее в команду XCopy.

Таким образом, копирование списка файлов в вашу команду намного лучше, если на самом деле в вашем случае, если вы действительно хотите весь каталог, а не только выбор, копирование каталогов происходит быстрее, чем копирование файла по файлу.

Надеюсь, на ваш вопрос.

+0

Спасибо это было очень информативный. Теперь я понимаю, почему первый пакетный файл терпит неудачу. Причина, по которой я перемещаю файл по файлу и создавая новую папку, - это то, что новая папка будет иметь новую «созданную дату» во время запуска командного файла, и я не хочу, чтобы имя папки было датой. Если копирование каталогов также не может изменить «созданную дату» в папке. – Tou

+0

Я думаю, что в '' 'copy' '' есть параметр для «касания» всех файлов с определенной датой ... я не уверен прямо сейчас, вам нужно будет проверить руководства там для '' '/ b'' 'right [copy command line switches] (https://technet.microsoft.com/en-us/library/bb490886.aspx) –

+0

Опцией может быть перетаскивание каталога контейнера в пакетный файл, а не на многочисленные файлы; поэтому пакетный скрипт может перечислить содержимое каталога самостоятельно, используя 'for' (даже рекурсивно при использовании switch'/R'), поэтому избегается слишком длинная командная строка; конечно, специальная фильтрация также может быть применена ... – aschipfl

0

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

@echo off 
setlocal 
set "destination=c:\destination" 

for %%i in (%~1) do set "parent=%%~pi" &goto:next 
:next 
for %%i in ("%parent:~0,-1%") do set "parent=%%~nxi" 

for %%i in (%*) do (
    echo: 
    if not exist %destination%\%parent%\nul (mkdir "%destination%\%parent%") 
    move "%%~i" "%destination%%parent%" 
) 

Кроме того, команда с большим количеством аргументов не является проблемой в предыдущем коде.

Например: Написать пакетный файл со следующим кодом

@echo off 
setlocal 
set "destination=c:\destination" 

for %%i in (%~1) do set "parent=%%~pi" &goto:next 
:next 
for %%i in ("%parent:~0,-1%") do set "parent=%%~nxi" 

for %%i in (%*) do (
    echo: 
    if not exist %destination%\%parent%\nul (echo mkdir "%destination%\%parent%") 
    echo move "%%~i" "%destination%%parent%" 
) 

вызов его test-move.bat и поставить следующую длинную командную строку 250 параметров в CMD:

test-move.bat TestFile001.txt TestFile002.txt TestFile003.txt TestFile004.txt TestFile005.txt TestFile006.txt TestFile007.txt TestFile008.txt TestFile009.txt TestFile010.txt TestFile011.txt TestFile012.txt TestFile013.txt TestFile014.txt TestFile015.txt TestFile016.txt TestFile017.txt TestFile018.txt TestFile019.txt TestFile020.txt TestFile021.txt TestFile022.txt TestFile023.txt TestFile024.txt TestFile025.txt TestFile026.txt TestFile027.txt TestFile028.txt TestFile029.txt TestFile030.txt TestFile031.txt TestFile032.txt TestFile033.txt TestFile034.txt TestFile035.txt TestFile036.txt TestFile037.txt TestFile038.txt TestFile039.txt TestFile040.txt TestFile041.txt TestFile042.txt TestFile043.txt TestFile044.txt TestFile045.txt TestFile046.txt TestFile047.txt TestFile048.txt TestFile049.txt TestFile050.txt TestFile051.txt TestFile052.txt TestFile053.txt TestFile054.txt TestFile055.txt TestFile056.txt TestFile057.txt TestFile058.txt TestFile059.txt TestFile060.txt TestFile061.txt TestFile062.txt TestFile063.txt TestFile064.txt TestFile065.txt TestFile066.txt TestFile067.txt TestFile068.txt TestFile069.txt TestFile070.txt TestFile071.txt TestFile072.txt TestFile073.txt TestFile074.txt TestFile075.txt TestFile076.txt TestFile077.txt TestFile078.txt TestFile079.txt TestFile080.txt TestFile081.txt TestFile082.txt TestFile083.txt TestFile084.txt TestFile085.txt TestFile086.txt TestFile087.txt TestFile088.txt TestFile089.txt TestFile090.txt TestFile091.txt TestFile092.txt TestFile093.txt TestFile094.txt TestFile095.txt TestFile096.txt TestFile097.txt TestFile098.txt TestFile099.txt TestFile100.txt TestFile101.txt TestFile102.txt TestFile103.txt TestFile104.txt TestFile105.txt TestFile106.txt TestFile107.txt TestFile108.txt TestFile109.txt TestFile110.txt TestFile111.txt TestFile112.txt TestFile113.txt TestFile114.txt TestFile115.txt TestFile116.txt TestFile117.txt TestFile118.txt TestFile119.txt TestFile120.txt TestFile121.txt TestFile122.txt TestFile123.txt TestFile124.txt TestFile125.txt TestFile126.txt TestFile127.txt TestFile128.txt TestFile129.txt TestFile130.txt TestFile131.txt TestFile132.txt TestFile133.txt TestFile134.txt TestFile135.txt TestFile136.txt TestFile137.txt TestFile138.txt TestFile139.txt TestFile140.txt TestFile141.txt TestFile142.txt TestFile143.txt TestFile144.txt TestFile145.txt TestFile146.txt TestFile147.txt TestFile148.txt TestFile149.txt TestFile150.txt TestFile151.txt TestFile152.txt TestFile153.txt TestFile154.txt TestFile155.txt TestFile156.txt TestFile157.txt TestFile158.txt TestFile159.txt TestFile160.txt TestFile161.txt TestFile162.txt TestFile163.txt TestFile164.txt TestFile165.txt TestFile166.txt TestFile167.txt TestFile168.txt TestFile169.txt TestFile170.txt TestFile171.txt TestFile172.txt TestFile173.txt TestFile174.txt TestFile175.txt TestFile176.txt TestFile177.txt TestFile178.txt TestFile179.txt TestFile180.txt TestFile181.txt TestFile182.txt TestFile183.txt TestFile184.txt TestFile185.txt TestFile186.txt TestFile187.txt TestFile188.txt TestFile189.txt TestFile190.txt TestFile191.txt TestFile192.txt TestFile193.txt TestFile194.txt TestFile195.txt TestFile196.txt TestFile197.txt TestFile198.txt TestFile199.txt TestFile200.txt TestFile201.txt TestFile202.txt TestFile203.txt TestFile204.txt TestFile205.txt TestFile206.txt TestFile207.txt TestFile208.txt TestFile209.txt TestFile210.txt TestFile211.txt TestFile212.txt TestFile213.txt TestFile214.txt TestFile215.txt TestFile216.txt TestFile217.txt TestFile218.txt TestFile219.txt TestFile220.txt TestFile221.txt TestFile222.txt TestFile223.txt TestFile224.txt TestFile225.txt TestFile226.txt TestFile227.txt TestFile228.txt TestFile229.txt TestFile230.txt TestFile231.txt TestFile232.txt TestFile233.txt TestFile234.txt TestFile235.txt TestFile236.txt TestFile237.txt TestFile238.txt TestFile239.txt TestFile240.txt TestFile241.txt TestFile242.txt TestFile243.txt TestFile244.txt TestFile245.txt TestFile246.txt TestFile247.txt TestFile248.txt TestFile249.txt TestFile250.txt 
Смежные вопросы