2

Вызов

Разбираясь в этом посте, как вы можете использовать префиксы в именах файлов, чтобы включить имена их родительских папок. Ответ @dbenham (см. ниже) великолепен, но он только префикс 'имя непосредственной родительской папки в имени файла. Powershell не допускается!

До:

C:\ Фотографии \ кошек
fileA.txt
fileB.txt
fileC.txt

После:

C:\ Фотографии \ кошек
Photos_cats_fileA.txt
Photos_cats_fileB.txt
Photos_cats_fileC.txt

Где разделитель "_" может быть любым символом.

Рядом с решением

Код @ dbenham из этого поста выглядит следующим образом:

@echo off
pushd "Folder"
for /d %%D in (*) do (
  pushd "%%D"
  for /r %%F in (*) do (
    for %%P in ("%%F\..") do (
      ren "%%F" "%%~nxP_%%~nxF"
    )
  )
  popd
)
popd

Что оно делает

C:\ Фотографии \ кошек
cats_fileA.txt
cats_fileB.txt
cats_fileC.txt

Опять же, это не включает "Фотографии". Как включить?

Упреждающее спасибо!

1 ответ1

0

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

Используйте пакетный файл ниже вместо того, что у вас было изначально.

@echo off
pushd "Folder"
setlocal enabledelayedexpansion
for /d %%D in (*) do (
  pushd "%%D"
  for /r %%F in (*) do (
    for %%P in ("%%F\..") do (
      set _path=%%~pnxP
      set _path=!_path:~1!
      ren "%%F" "!_path:\=_!_%%~nxF"
    )
  )
  popd
)
popd

Различия:

  • setlocal enabledelayedexpansion - включить отложенное расширение
  • set _path=%%~pnxP - создать переменную для хранения полного пути (без буквы диска) файла
  • set _path=!_path:~1! - полный путь включает в себя \ in C:\ в начале, поэтому нам нужно удалить его.
  • echo "%%F" "!_path:\=_!_%%~nxF" - заменить обратную косую черту подчеркиванием

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .