Заменить строку другой строкой - PullRequest
0 голосов
/ 13 декабря 2018

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

Мой файл раньше был apple Oct'18 banana.xlsx, я хочу изменить его на 'apple Nov'18 banana.xlsx'

Ближайший, который я получил, использовалRen *oct*.xlsx "* Nov'18 banana*".xlsx но результат, который я получил взамен, был apple Oct Nov banana.xlsx

Однако я не могу полностью заменить октябрь.

Ответы [ 3 ]

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

Поскольку партия знает только, что переменная типа строка ad не подходит для вычислений даты и времени,
Я предлагаю использовать PowerShell для этого.

С

  • [тип datetime] и
  • метод .AddMonths()
  • Регулярное выражение, основанное на -match операторе

, которое будет выполнять даже пересечение границ года:

## Q:\Test\2018\12\13\SO_53757192.ps1
$CI = [cultureinfo]::InvariantCulture
$dt = ' MMM\''yy '
Get-ChildItem '* ???''[0-9][0-9] *.xlsx' |
  Where-Object BaseName -match ' (Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec)''(\d{2}) ' |
    Rename-Item -NewName {$_.Name -replace $Matches[0],
      [datetime]::ParseExact($matches[0],$dt,$CI).AddMonths(1).ToString($dt)} # -WhatIf

Вы можете вызвать его из пакета в виде файла

powershell -NoP -Ex bypass -File ".\SO_53757192.ps1"

Или собрать в одну строку

powershell -NoP -C "$CI=[cultureinfo]::InvariantCulture;$dt=' MMM\''yy ';Get-ChildItem '* ???''[0-9][0-9] *.xlsx'|Where-Object BaseName -match ' (Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec)''(\d{2}) '|Rename-Item -NewName {$_.Name -replace $Matches[0],[datetime]::ParseExact($matches[0],$dt,$CI).AddMonths(1).ToString($dt)}"
0 голосов
/ 13 декабря 2018

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

Вы можете написать пакетный файл со следующим кодом и назвать его ren_date.bat:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=."   & rem // (root directory; `.` is current, `%~dp0.` is parent)
set "_FROM=%~1" & rem // (name portion to be replaced; `%~1` is 1st argument)
set "_TO=%~2"   & rem // (name portion to be inserted; `%~2` is 2st argument)

rem // Enumerate all matching files (note the SPACE behind the asterisk):
for /F "delims=| eol=|" %%J in ('dir /B /A:-D "%_ROOT%\* %_FROM%*.xlsx"') do (
    rem // Store current file name, initialise variable for new name:
    set "FILE=%%J" & set "NAME="
    rem // Toggle delayed expansion to avoid loss of exclamation marks:
    setlocal EnableDelayedExpansion
    rem /* Replace each SPACE in current file name by `" "` and enclose the
    rem    whole string in between `""`, so we get a list of quoted items,
    rem    which reflect all the SPACE-separated file name parts: */
    for %%I in ("!FILE: =" "!") do (
        endlocal
        rem // Store current file name part:
        set "PART=%%~I"
        setlocal EnableDelayedExpansion
        rem /* Assemble new name, performing the intended substitution of the
        rem    predefined sub-strings; the `for /F` loop is needed to transport
        rem    the resulting new file name over the `endlocal` barrier: */
        for /F "delims=| eol=|" %%K in ("!NAME! !PART:%_FROM%=%_TO%!") do (
            endlocal
            rem // Store the assembled name portion:
            set "NAME=%%K"
            setlocal EnableDelayedExpansion
        )
    )
    rem // Now rename file to the assembled new name:
    ren "!_ROOT!\!FILE!" "!NAME:~1!"
    endlocal
)

endlocal
exit /B

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

ren_date.bat "Oct'18" "Nov'18"

Ссылаясь на пример из мой ответна ваш предыдущий вопрос , это должно переименовать файлы:

and some pears Oct'18_xyz.xlsx
apples Oct'18.xlsx
bananas Oct'18.xlsx
more fruit Oct'18_xyz.xlsx
oranges Oct'18.xlsx
plus peaches Oct'18_xyz.xlsx
strawberries Oct'18 abcdef.xlsx

На эти:

and some pears Nov'18_xyz.xlsx
apples Nov'18.xlsx
bananas Nov'18.xlsx
more fruit Nov'18_xyz.xlsx
oranges Nov'18.xlsx
plus peaches Nov'18_xyz.xlsx
strawberries Nov'18 abcdef.xlsx

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

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

Попробуйте ren *.xlsx ??????Nov??????????.*

* - это подстановочный знак, соответствующий каждому расширению ".xlsx".

? - это подстановочный знак, чтобы все символы в исходном файле оставались без изменений.

...