2013-11-11 9 views
0

Я только начал работу над большим проектом, который в основном состоит из анализа данных и поиска алгоритмов для поддержания определенной функции системы.batch: сравнение имен файлов и их переименование

Чтобы начать работу, я получил кучу записанных данных, которые, к сожалению, несовместимы, когда дело доходит до наименования. Обычно все файлы (все в одной папке) должны начинаться с SPY.SPYNODE.SIDE, а затем продолжаться с конкретными именами для каждого значения или переменных. Однако регистратор данных испортил его пару раз и дает странные имена, такие как SP0E1A~1.csv (все файлы являются CSV-файлами).

Вот и я решил, что вместо того, чтобы переименовать пару тысяч файлов вручную, я мог бы «легко» использовать простой командный файл для выполнения этого задания для имени. И это именно то, когда я начал сходить с ума :-)

До сих пор я придумал следующее:

FOR /R %%i in (%CD%) DO (
    set file1=%%i 
    if not %file1%=="SPY.SPYNODE.SIDE" DO (
    set /p "filename" < %file1% 
    rename %file1% %filename% 
) 
) 

Так что я хочу сделать это (в псевдокоде)

look through the whole folder and every file 
    save the filename in variable file1 
    if file1 partially equals SPY.SPYNODE.SIDE 
     open the file and save the first line (which contains the correct name of the file) in variable filename 
     rename the file with the correct filename 

Но пока это действительно не работает, и я не знаю почему.

Как мне продолжить?

+0

Если это Windows (похоже, это), перейдите на Powershell или WSH (Windows Scripting Host) через VBScript или JScript. Первый предварительно установлен с Vista (IIRC), последний доступен в любой разумной версии Windows. Эти среды намного мощнее, чем 'cmd.exe'. [Один пример] (http://www.vbforums.com/showthread.php?504189-Rename-multiple-files-in-a-folder&s=672f44a31da84b872b13eae691ec8167&p=3111195&viewfull=1#post3111195). – kostix

+0

Как SP0E1A ~ 1 частично соответствует SPY.SPYNODE.SIDE? И, как первая строка файла? –

ответ

0

Вы не сказали, что это такое, и это неправильно, поэтому я должен угадать.

Я не тщательно проверить сценарий (путем создания дерева файловой системы, как вы описали), но эта модификация, кажется, вероятно, будет работать:

FOR /R %%i in (*) DO (
    IF NOT "%%~nxi"=="SPY.SPYNODE.SIDE" DO (
    SET /P filename= < "%%~i" 
    RENAME "%%~i" "%filename%" 
) 
) 

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

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

%%~nxi дает вам только имя файла и расширение. В противном случае вы получите полный путь к файлу, и сравнение равенства не будет выполнено для любого файла, не содержащегося в CWD.

Для выражения set /p требуется выражение равно (=) после имени переменной, а имя переменной не может быть в кавычках. (Они не должны быть нужны, поскольку имена переменных не могут содержать пробелы или специальные символы.)

Если имя файла в специальном файле (SPY.SPYNODE.SIDE) является абсолютным путем, команда переименования, скорее всего, будет потерпеть неудачу. Вам придется «переместить» файл, а не переименовывать его.

0
@ECHO OFF 
SETLOCAL 
PUSHD \sourcedir 
FOR /R %%i in (*.csv) DO (
ECHO %%i|FIND /i "spy.spynode.side" >NUL 
IF ERRORLEVEL 1 (
    SET renme=Y 
    FOR /f "delims=" %%r IN ('TYPE "%%i"') DO IF DEFINED renme SET "renme="&REN "%%i" "%%r.csv" 
) 
) 
POPD 
GOTO :EOF 

Это должно сработать для вас.

Ваша проблема заключается в том, что в составном операторе (например, в FOR) в %var% заменяется во время синтаксического анализа по содержанию переменного во время синтаксического анализа - и это касается всего заявления от FOR ключевого слова до закрывающей скобки ,

Существуют простые способы обойти это (проблема «с задержкой расширения» - много, много элементов SO), но в этом случае это не требуется.

Во-первых, PUSHD переключается на требуемую diectory, то FOR/R захватывает все из .CSV имен файлов и применяет их к %%i, в свою очередь.

ECHO ИНГИ %%i в FIND для искомой строки (/i = регистронезависимых) будет установлен ERRORLEVEL 0, если найдено; ненулевое значение. >nul подавляет эхо результата FIND.

Формат IF ERRORLEVEL 1 ИСТИНА, если ERRORLEVEL равно 1 или больше, и ERRORLEVEL устанавливается FIND. Обратите внимание, что IF %ERRORLEVEL% GEQ 1 НЕ будет работать здесь, потому что %errorlevel% будет заменено значением PARSE-TIME ERRORLEVEL и таким образом быть инвариантным.

Установка renme в Y (ну, любое значение будет делать) гарантирует, что IS определено для первой строки, прочитанной из файла, имя которого удобно в %%i но renme затем очищается и не является, следовательно, больше не DEFINED, следовательно, Команда REN будет выполнена только для первой строки.

Я не уверен, хотите ли вы добавить .csv в имя файла или читать. Очевидно, удалите, если не требуется.

Смежные вопросы