아래와 같이 단일 폴더에 많은 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
. 루프 내부에서 파일 이름만 축소된 매개변수인 file
as라는 변수를 설정합니다. 해당 파일의 폴더가 이미 존재하는지 확인하기 위해 하나의 명령문을 사용합니다 . 그렇지 않은 경우 로 폴더를 만든 다음 다른 명령문을 사용하여 현재 보고 있는 파일이 폴더에 이미 존재하는지 확인합니다. 방금 확인/만들었습니다. 그렇지 않은 경우 파일을 폴더로 이동 하고 확인 메시지를 표시하지 않습니다 ( 문으로 시작하기 때문에 실제로는 필요하지 않지만 모범 사례입니다). move 명령에는 이름 변경 기능이 내장되어 있으므로 이를 사용하여 원하는 명명 체계를 따르기만 하면 됩니다.%%~nA
%%A
if
md
if
move
/y
/y
if
여기서 치즈 부분은 변수 하위 문자열입니다. 날짜와 위치는 설정된 문자 수이므로 해당 문자를 세어 필요에 따라 추출합니다.
!file:~-6!
마지막 6자(LOC 정보)만 가져오고 !file:~0,8!
처음 8자(LOC 정보)만 가져옵니다. 날짜 정보). 주목할 가치가 있는 유일한 다른 점은 지연된 확장을 사용하는 루프 내에서 느낌표를 사용하는 것입니다(변하는 변수이기 때문입니다). 정적 변수( dir
및 des
)의 경우 백분율 기호는 전체적으로 괜찮습니다.
바라건대 이것이 당신이 원하는 바가 되거나 최소한 올바른 방향으로 나아갈 수 있기를 바랍니다.
답변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이 아닌화면 표시를 방지합니다. 그 다음에이동 항목정말 들리는 대로 작동합니다! :)