Путаница по методу REN - PullRequest
       2

Путаница по методу REN

0 голосов
/ 04 декабря 2018

Я попытался рекурсивно переименовать все файлы в папке через VBA.

    Sub FileNameCleaner()
'***************************************************************************
'Purpose: Update the filename to the latest valuation date.
'Author: Justin Sun
'Date: July 12th, 2018
'Inputs: nil
'Outputs: nil
'***************************************************************************
    Dim valdate, prvdate, myline As String
    valdate = "1811"
    prvdate = "1810"

    myline = "&& for /r %i in (*" & prvdate & "*) do ren ""%i"" ""*" & valdate & "*"" "
    mydate = "C:\Users\j1sunx\Desktop\test\"
    Call Shell("cmd /k cd " & mydate & myline, vbNormalNoFocus)


End Sub

Логика довольно проста, используйте подстановочный знак, чтобы заменить предыдущий месяц на текущий месяц.Этот метод отлично работает в течение другого месяца, но он завершается ошибкой в ​​11 месяце. Приведенный выше код пытался обновить дату с 1810 по 1811 год. Но в моем тестовом примере.Это меняет мое имя файла 201810.txt на 20181811.txt.

Заранее спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 декабря 2018

Почему это не работает:

Давайте разберем вашу команду:

Ваша команда переведена в ren "C:\Users\j1sunx\Desktop\test\201810.txt" "*1811*". Эта страница объясняет, как оценивается *1811*:

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

Первый * с 1 будетсопоставлять что-либо до последней 1 строки: так C:\Users\j1sunx\Desktop\test\20181.

Затем мы добавляем 810, которые являются простыми символами без специальных значений.

* В концеof sourceMask - добавляет все оставшиеся символы из источника в цель.Если уже в конце источника, то ничего не делает.

Тогда конец имени файла

Всего: C:\Users\j1sunx\Desktop\test\20181810.txt

Ключ в том, что первый* очень жадный.

Решение по замене:

Поскольку вы уже используете VBA, я предлагаю вам использовать операторы / функции vbaнапример Dir и Имя или FileSystemObject

Пример решения (может потребоваться улучшение)

ChDir mydate
myline = Dir("*" & prvdate & "*")
While myline <> vbNullString
    Name myline As Replace(myline, prvdate, valdate)
    myline = Dir()
Wend
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...