2014-01-19 3 views
2

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

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

setlocal EnableDelayedExpansion 
set "IncomingFolder=D:\Test" 
set "showsFolder=D:\Test\" 

for %%F in ("%incomingFolder%\*.S*.*") do ( for /f "delims=.S" %%A in ("%%~nF") do (
if not exist "%showsFolder\%" md "%showsFolder%\%%A" 
move "%%F" "%showsFolder%\%%A" )) 

Например: Если файлы Hustle.SXX.XXX Затем он делает правильную папку с именем «Хастл». Но если он назван The.Hustle.SXXX.XXX, тогда он создает только папку «The», мне нужно использовать это имя до «.S».

Кто-нибудь, кто может мне помочь?

ответ

0

Это использует вспомогательный командный файл repl.bat - скачать с: https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

Место repl.bat в той же папке, что и командный файл, или в папке, находящейся на пути.

Испытание это, чтобы увидеть, как она идет:

@echo off 
set "IncomingFolder=D:\Test" 
set "showsFolder=D:\Test" 

for %%F in ("%incomingFolder%\*.S*.*") do (
    for /f "delims=" %%A in (' echo "%%~nF"^|repl ".(.*)S\d\d.*" "$1" ') do (
     md "%showsFolder%\%%A" 2>nul 
     move "%%F" "%showsFolder%\%%A" 
    ) 
) 
+0

Спасибо, это сделало именно то, что мне было нужно, но я надеялся написать все это в одном файле вместо вызывая другое. Но пока это отлично для моей цели. – Lasser

1
@ECHO OFF 
SETLOCAL 
set "IncomingFolder=c:\sourcedir" 
set "showsFolder=D:\Test" 

for %%F in ("%incomingFolder%\*.S*.*") do (for /f "delims=." %%A in ("%%~nF") do (
ECHO md "%showsFolder%\%%A" 
ECHO move "%%F" "%showsFolder%\%%A\" 
) 
) 

GOTO :EOF 

Я изменил имена каталогов в соответствии с моей системой.

я не мог воссоздать эту проблему, вы можете описать, но delims=.S бы разделители .илиS, не .S. Это может быть то, что вы видите.

Необходимые команды MD - это всего лишь ECHO ed для целей тестирования. После того, как вы подтвердите правильность команд, измените ECHO MD на MD, чтобы фактически создать каталоги. Добавить 2>nul для подавления сообщений об ошибках (например, когда каталог уже существует)

Кроме того, требуемые команды MOVE являются просто ECHO ed для целей тестирования. После того, как вы подтвердите правильность команд, измените значение ECHO MOVE на MOVE, чтобы на самом деле переместить файлы. Добавить >nul для подавления сообщений отчета (например, 1 file moved)

+0

Я думаю, вы пропустили точку вопроса Из того, что я могу. tell, файл с именем 'The.Hustle.SXXX.XXX' будет по-прежнему приводить к папке с именем' The', но OP хочет 'The.Hustle'. – dbenham

+0

Это правильный dbenham. Мне нужно, чтобы он разделился на« .S «Таким образом, он всегда будет создавать папку на основе любой строки, которую он найдет до этого момента, который всегда есть .S. – Lasser

+0

@dbenham Хм - очень вероятно. Спекуляции на моих спецификациях. Нужно чистить монитор. Нельзя спешить с этими большими работами. .. – Magoo

1

Вы не можете использовать FOR/F для анализа из-за фронта, потому что вы не знаете, сколько . может отображаться в названии. Я предполагаю, что вы ожидаете таких имен, как part1.part2.Spart3.part4, но не как part1.part2.Spart3.part4.part5. Другими словами - вам не нужны две точки после .S. Если да, то вы можете безопасно удалить все после второй до последней точки. Это легко сделать с помощью модификатора ~n дважды.

for %%F in ("%incomingFolder%\*.S*.*") do for %%A in ("%%~nF") do (
    if not exist "%showsFolder%\%%~nA" md "%showsFolder%\%%~nA" 
    move "%%F" "%showsFolder%\%%~nA\" 
) 

(щекотал Magoo - % отсутствует на «входящие» и ~n требуется вселения назначения)

+0

Спасибо за ответ, но я не уверен, как я могу использовать это в том случае, о котором я описал, или на самом деле я не как правильно вводить мои сценарии, когда я это делаю, я получаю сообщение об ошибке. – Lasser

+0

@Magoo - да, спасибо за изменения. Глупые ошибки с моей стороны. – dbenham

+0

@ Lasser - ??? Я не понимаю твое замешательство. Код просто заменяет циклы FOR в вашем коде. И он должен работать с именами, такими как «The.Hustle.Sxx.xxx» и «Hustle.Sxx.xxx». Он не будет работать правильно на «This.Fails.Sxx.xxx.xxx». – dbenham

0
setlocal EnableDelayedExpansion 
set "IncomingFolder=D:\Test" 
set "showsFolder=D:\Test" 

for %%F in ("%incomingFolder%\*.S*.*") do (
    set "file=%%~nF" 
    for /F "delims=" %%A in ("!file:*.S=!") do set "folder=!file:.S%%~A=!" 
    if not exist "%showsFolder%\!folder!" md "%showsFolder%\!folder!" 
    move "%%F" "%showsFolder%\!folder!" 
) 
  • set "file=%%~nF" получить имя файла, например: set "file=The.Hustle.SXXX.XXX"
  • !file:*.S=! является частью после первого».S «например XXX.XXX, так
  • set "folder=!file:.S%%~A=!" это имя файла без» .SXXX.XXX», например:„The.Hustle“
Смежные вопросы