フォルダ名の一部をファイル名の先頭に追加します

フォルダ名の一部をファイル名の先頭に追加します

これは基本的に回答済みの質問の続きですが、条件が追加されています。

ファイル名の先頭にフォルダ名を追加する

ディレクトリ構造は以下のようになります。

Folder
  > SubFolder1xxxx
    > FileName1.abc
    > Filename2.abc
    > .............

  > SubFolder2xxxx
    > FileName11.abc
    > Filename12.abc
    > ..............

  > ..........

サブフォルダ内のファイルの名前を次のように変更します。

SubFolder1_Filename1.abc
SubFolder1_Filename2.abc
SubFolder2_Filename11.abc
SubFolder2_Filename12.abc

つまり、ファイル名の先頭に区切り文字「_」を使用してフォルダー名の一部を追加します。ディレクトリ構造は変更されません。

以下のスクリプトがあります


for /d %D in (*) do (
  for %F in ("%~D\*") do (
    for %P in ("%F\..") do (
      ren "%F" "%~nxP_%~nxF"
    )
  )
)

上記のスクリプトの問題点は、フォルダ名全体を取得していることです。

そこで、構文サブストリングを使用してファイル名の一部のみを抽出しようとしました。

 %variable:~num_chars_to_skip,num_chars_to_keep%

そこで上記のコードを修正しましたが、エラーが発生しました:(

for /d %D in (*) do (
      for %F in ("%~D\*") do (
        for %P in ("%F\..") do (
          ren "%F" "%~nxP:~0,10%_%~nxF"
        )
      )
    )

エラーは基本的に構文substringが機能せず、単に文字列として出力されることです。このような感じです

SubFolder1xxxx:~0,10%

答え1

バッチファイルのフォルダー名を取得するサンプルバッチ。

@echo off
set a=%~p0%
for /f "tokens=1,2,3,4,5,6,7,8,9 delims=\" %%a in ("%a%") do call :getlast %%a %%b %%c %%d %%e %%f %%g %%h %%i
goto :eof
:getlast
if "%1"=="" goto :eof
if "%2"=="" echo Current folder name is %1.
shift
goto :getlast

現在の制限: サブフォルダー レベルは 9 以下にしてください (編集し、必要に応じて Slack を解析してください)、名前にスペースは使用できません (編集し、必要に応じて引用符を追加してください)。

関連情報