파일 이름에서 폴더 이름을 추출하고 해당 폴더로 파일을 이동하는 BAT 파일

파일 이름에서 폴더 이름을 추출하고 해당 폴더로 파일을 이동하는 BAT 파일

저는 Windows Bat 파일 프로그래밍에 익숙하지 않으므로 이에 대한 도움을 주시면 감사하겠습니다.

다음을 수행하려면 bat 파일이 필요합니다.

  • 파일 이름에서 폴더 이름을 추출합니다. 예를 들어 파일 이름 "123-Chemistry-101.rep"에서 Chemistry를 추출합니다. "-"는 토큰의 시작과 끝을 표시하는 데 사용할 수 있습니다.
  • 동일한 파일을 Chemistry라는 폴더로 이동합니다. 화학은 모든 보고서가 있는 하위 디렉토리가 됩니다.

아마도 두 번째 부분(이 사이트에서 찾은)을 수행할 수 있지만 첫 번째 부분은 내 능력을 넘어서는 것입니다.

예를 들어, (*.rep)의 /RU:\Test %%f의 경우 %%f U:\test\Chemistry\를 복사하세요.

감사합니다, 듀랜드

답변1

당신이 요청했지만 오늘은 그런 작업을 수행하기에 다소 구식이라고 생각하기 때문에 귀하의 시스템이 다음을 지원하기를 바라 Batch면서 대답했습니다 .PowershellBatchPowershell

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep

foreach($file in $files) {
  $folder = $file.toString().split("-")[1]
  $sourcefile = "$rootDir\$file"
  $targetdir = "$rootDir\$folder"
  if(!(Test-Path -Path $targetdir )){
    New-Item -ItemType directory -Path $targetdir
  }
  Move-Item $sourcefile $targetdir
}

@Karan 편집:

재귀(하위 디렉터리 트리 유지):

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep -Recurse

foreach($file in $files) {
  $sourcefile = $file.Fullname
  $filepath = $file.PSParentPath
  $newfoldertocreate=$file.toString().split("-")[1]
  if(!(Test-Path -Path $filepath\$newfoldertocreate)){
    New-Item -ItemType directory -Path $filepath\$newfoldertocreate
  }
  Move-Item $sourcefile $filepath\$newfoldertocreate
}

답변2

상위 폴더에서 이 배치 파일을 실행합니다.보고서 폴더:

for /f "delims=" %%a in ('dir /b /s "Reports folder\*.rep"') do for /f "tokens=2 delims=-" %%i in ("%%~a") do (
    if not exist "%%~dpa%%i\" md "%%~dpa%%i"
    move "%%~a" "%%~dpa%%i\"
)

%%a와 %%i는 두 변수에 사용되는 변수입니다.~을 위한루프. 전자는 .REP 파일에 대한 전체 경로를 포함하고(외부 루프 제공), 후자는 파일 이름에서 추출된 폴더 이름을 포함합니다(내부 루프 제공).

for /?관심 있는 사람이라면 누구나 더 많은 도움을 받아야 할 것입니다(배치 파일에서는 % 기호가 두 배가 됩니다).

%~I  - expands %I removing any surrounding quotes (")
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only

그럼 "%%~dpa%%i"는 무슨 뜻인가요? .REP 파일 중 하나가 다음 위치에 있다고 가정합니다.디렉토리명령은 "C:\Reports folder\123-Chemistry-101.rep".

%%~dpa는 주변 따옴표를 제외한 파일의 드라이브 문자와 경로를 의미합니다 C:\Reports folder\. 즉, .

%%나위에서 언급한 것처럼 파일 이름에서 추출된 폴더 이름(두 개의 하이픈 구분 기호 사이의 모든 이름)이 됩니다. 따라서 이 경우에는 Chemistry.

모두 합치면 이 파일의 "%%~dpa%%i"는 로 확장됩니다 "C:\Reports folder\Chemistry". 왜냐하면 파일을 이동하려는 위치가 바로 이 위치이기 때문입니다.

관련 정보