조건에 따라 폴더 이동

조건에 따라 폴더 이동

아래와 같이 단일 폴더에 많은 Excel 파일이 있습니다.

+----------------------+
| 01012019_LOC001.xlsx |
| 01012019_LOC002.xlsx |
| 01012019_LOC003.xlsx |
| 02012019_LOC001.xlsx |
| 02012019_LOC002.xlsx |
| 02012019_LOC003.xlsx |
| 03012019_LOC001.xlsx |
| 03012019_LOC002.xlsx |
| 03012019_LOC003.xlsx |
+----------------------+

날짜와 위치 조합 구조DDMMYYYY_LOCXXX

이 파일을 아래 구조와 유사하게 생성된 해당 폴더로 이동하고 싶습니다.

MAIN_FOLDER
|
|-LOC001
  |-01012019
  |-02012019
  |-03012019
  |
|-LOC002
  |-01012019
  |-02012019
  |-03012019
  |
|-LOC003
  |-01012019
  |-02012019
  |-03012019
|

으로 한 번에 하나씩 전송할 수 있습니다 for /r %d in (01012019_LOC001.xlsx) do move "%d" "C:MAIN_FOLDER\LOC001\01012019\".

하지만 저는 좀 더 역동적인 솔루션을 찾고 있습니다. 그러므로 해결책을 찾을 수 있도록 안내해 주십시오.

PSNote:- powershell 답변으로도 충분합니다.

답변1

이를 위해 지연된 확장으로 파일을 반복하는 것이 좋습니다. 끌어오고 싶은 하위 폴더가 없으면 재귀적이므로 /r플래그를 피하겠습니다. for주요 문제는 각 절반이 별도의 정보이기 때문에 파일 이름을 분할하는 것입니다. 다음과 같이 보일 것입니다 :

@echo off

set "dir=C:\Your\Excel\File\Directory"
set "des=C:\MAIN_FOLDER"

setlocal enabledelayedexpansion
for %%A in (%dir%\*.xlsx) do (
    set "file=%%~nA"
    if not exist "%des%\!file:~-6!" md "%des%\!file:~-6!"
    if not exist "%des%\!file:~-6!\!file:~0,8!.xlsx" move /y "%dir%\%%~nxA" "%des%\!file:~-6!\!file:~0,8!.xlsx"
)

이것은 일괄 솔루션이므로 메모장에 복사하여 붙여 넣은 .bat다음 .txt.

dir먼저 (디렉터리, 현재 Excel 파일이 있는 위치) 및 (대상, 폴더를 만들고 파일을 이동할 위치) 에 대한 변수를 설정했습니다 des. 환경을 반영하도록 해당 값을 편집해야 합니다. 다른 작업을 수행하기 전에 setlocal enabledelayedexpansion루프 반복마다 값을 변경하는 변수로 작업하므로 를 사용합니다. 그러면 for디렉토리의 최상위 폴더에 있는 모든 Excel 파일을 반복하여 매개변수에 할당합니다 %%A. 루프 내부에서 파일 이름만 축소된 매개변수인 fileas라는 변수를 설정합니다. 해당 파일의 폴더가 이미 존재하는지 확인하기 위해 하나의 명령문을 사용합니다 . 그렇지 않은 경우 로 폴더를 만든 다음 다른 명령문을 사용하여 현재 보고 있는 파일이 폴더에 이미 존재하는지 확인합니다. 방금 확인/만들었습니다. 그렇지 않은 경우 파일을 폴더로 이동 하고 확인 메시지를 표시하지 않습니다 ( 문으로 시작하기 때문에 실제로는 필요하지 않지만 모범 사례입니다). move 명령에는 이름 변경 기능이 내장되어 있으므로 이를 사용하여 원하는 명명 체계를 따르기만 하면 됩니다.%%~nA%%Aifmdifmove/y/yif

여기서 치즈 부분은 변수 하위 문자열입니다. 날짜와 위치는 설정된 문자 수이므로 해당 문자를 세어 필요에 따라 추출합니다.
!file:~-6!마지막 6자(LOC 정보)만 가져오고 !file:~0,8!처음 8자(LOC 정보)만 가져옵니다. 날짜 정보). 주목할 가치가 있는 유일한 다른 점은 지연된 확장을 사용하는 루프 내에서 느낌표를 사용하는 것입니다(변하는 변수이기 때문입니다). 정적 변수( dirdes)의 경우 백분율 기호는 전체적으로 괜찮습니다.

바라건대 이것이 당신이 원하는 바가 되거나 최소한 올바른 방향으로 나아갈 수 있기를 바랍니다.

참조:~을 위한,변수 하위 문자열,이동하다

답변2

완전성을 위해 다음은파워셸버전:

$Source = 'C:\Source'
$Dest   = 'C:\Destination'

Get-ChildItem $source -filter *.xls | foreach{
   $FolderName = $_.Basename.Split('_')[1]
   If (!(Test-Path "$Dest\$FolderName")) {
      New-Item -Path $Dest -Name $FolderName -ItemType Directory | out-null
   }
   Move-Item $_.FullName "$Dest\$FolderName"
}

나는 받기로 결정했다위치###밑줄로 기본 이름을 분할하여 문자열을 분리하면 그 자체로 두 요소로 구성된 문자열 배열이 반환됩니다. 그만큼1아래 첨자는 두 번째 요소를 참조합니다. 만약에테스트 경로실패하면 폴더를 만들고 반환을 파이핑합니다.null이 아닌화면 표시를 방지합니다. 그 다음에이동 항목정말 들리는 대로 작동합니다! :)

Get-ChildItem

ForEach-객체

String.Split 메서드

테스트 경로

새로운 물품

이동 항목

관련 정보