파일 목록을 가져오고 배치 파일을 사용하여 문자열 조작 (중복 검사) 및 조건에 대한 입력으로 파일 이름을 사용하는 방법은 무엇입니까?

Lordy

다음과 같은 Windows 배치 파일을 만들려고합니다.

1st : 현재 디렉토리의 파일을 나열하고 파일 이름 목록에 출력합니다 (Filelist_ [YYY] [MM] [DD] [hh] [mm] ss]).

2nd : 주어진 파일 이름 목록에서 각 줄을 3 단계의 입력으로 읽습니다.

3 번째 : 파일의 첫 번째 줄을 읽고 7 번째, 9 번째, 14 번째 문자열을 추출합니다.

Delimiter can be "~", "*" and "^"

4 번째 : 7 번째를 ISAsender 변수로, 9 번째를 ISAreceiver로, 14 번째 문자열을 ISActrlnum으로 지정합니다.

5th : 에코 된 변수를 단일 로그 파일 (EDI.log)로 리디렉션합니다.

편집 : 6 일 : ISActrlnum이 이미 존재하거나 중복 된 경우 ISAsender의 CNtable.txt (예 : ISA의 APPLESND의 경우 AP_CNtable.txt, SAMSUNGSND의 경우 SS_CNtable)를 확인합니다. 처음에 CNtable.txt는 ISActrlnum (제어 번호)의 덤프 된 값을 포함합니다.

a. If there is duplicate control number found, exit with error message and output to Dupfile.txt as well as the ISActrlnum in issue. Move file to EXCEPT folder.
b. If not duplicate, insert ISActrlnum to CNtable.txt then proceed to 7th.

7th : ISAsender 및 ISAreceiver에 IF 조건을 사용하여 파일을 해당 폴더로 이동합니다. 8 일 : 두 번째 단계가 EOF에 도달하거나 각 행을 읽을 때까지 3-7 일을 반복합니다.

예 : 주어진 Filelist_20141022010101에서 FileName.txt에는 구분 기호로 "~"가있는 다음이 포함됩니다.

ISA~00~          ~00~          ~ZZ~APPLESND       ~14~APPLERCV       ~130214~2300~U~00401~000000001~0~T~>
GS~FA~APPLESND~APPLERCV~20130214~2300~810~X~004010
ST~997~131250001
AK1~SC~1809
AK9~A~1~1~1
SE~4~131250001
GE~1~810
IEA~1~000000001

CNtable.txt에는 다음이 포함됩니다.

000000004
000000002
000000003
000000005

CNtable.txt에는 ISActrlnum = 000000001이 없으므로 ISActrlnum을 추가하여 CNtable.txt를 업데이트합니다. 여기에서는 ISAsender 및 ISAreceiver에 대한 조건문 만 사용됩니다. 따라서 ISAsender = APPLESND 및 ISAreceiver = APPLERCV이면 현재 파일 (FileName.txt)을 C : \ VP \ APPLE과 같은 특정 디렉터리로 이동합니다. Filelist_20141022010101 내의 다음 파일 이름에 대해 동일한 논리입니다.

아래 코드를 작성할 수 있었지만 FORFILES에서 파일 이름을 가져와 FOR LOOP의 변수 입력으로 다시 사용하는 방법을 모르겠습니다.

REM FileReceiver.bat
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set YYYY=%dt:~0,4%
set MM=%dt:~4,2%
set DD=%dt:~6,2%
set HH=%dt:~8,2%
set Min=%dt:~10,2%
set Sec=%dt:~12,2%

set TIMESTAMP=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%

C:
cd "C:\VP"

FORFILES /P "C:\VP" >"FLIST.%TIMESTAMP%"


set first=1
for /f "tokens=7 delims=~" %%a in (FileName.txt) do (
      if %first%==1 (
           set first=0
       set ISAsender=%%a
       echo %ISAsender%

      )
)

set first=1
for /f "tokens=9 delims=~" %%b in (FileName.txt) do (
      if %first%==1 (
           set first=0
       set ISAreceiver=%%b
       echo %ISAreceiver%

      )
)
set first=1
for /f "tokens=14 delims=~" %%c in (FileName.txt) do (
      if %first%==1 (
           set first=0
       set ISActrlnum=%%c
       echo %ISActrlnum%
      )
)


if %ISAsender%=="APPLESND" if %ISAreceiver=="APPLERCV"    (
    move FileName.txt "C:\VP\APPLE"
    )

if %ISAsender%=="SAMSUNGSND" if %ISAreceiver=="SAMSUNGRCV"    (
    move FileName.txt "C:\VP\SAMSUNG"
    )

누구든지 중복 제어 번호 (ISActrlnum)를 확인하는 다른 배치 파일을 호출하지 않고도 요구 사항을 충족하도록 도울 수 있습니까? 가능한 한 전체 코드를 단일 bat 파일로 원합니다. 내 긴 설명을 참아주세요.

Mofi

배치 파일을 다시 코딩하기 위해 컴퓨터에있는 전체 환경을 설정해야했지만 얻은 것 같습니다.

주석 (로 시작하는 줄)을 읽고 rem배치 파일을 이해하고 필요한 경우 환경에 맞게 조정하십시오.

@echo off
REM FileReceiver.bat
setlocal

rem Get current date and time as local time independent on Windows region settings.
for /F "tokens=2 delims==." %%T in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "dt=%%T"

rem Reformat the date and time strong to wanted format.
set "YYYY=%dt:~0,4%"
set "MM=%dt:~4,2%"
set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%"
set "Min=%dt:~10,2%"
set "Sec=%dt:~12,2%"
set "TimeStamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"

rem Define name of the list file containing current date and time in name.
set "ListFile=FLIST_%TimeStamp%.lst"

rem Change directory (and drive).
cd /D "C:\VP"

rem Create the list file which is good here as the list of files changes
rem while running this batch file and therefore it is better to work with
rem a list file instead of running a FOR directly for each file in the
rem directory. The list file is not included in this list as it either does
rem not exist at all or it has wrong file extension as only *.txt files are
rem listed by command DIR. The log file EDI.log has also wrong file extension.
dir *.txt /A-D /B /ON >%ListFile%

rem It might be useful to delete the log file from a previous run.
if exist EDI.log del EDI.log

rem Process each file in the list file.
for /F "delims=" %%F in ( %ListFile% ) do call :ProcessFile "%%F"

rem Delete the list file as not needed anymore. It could be also kept.
del %ListFile%

rem Exit batch file.
endlocal
goto :EOF


:ProcessFile
rem The parameter passed from first FOR is the file name in double quotes.
set "FileName=%~1"

rem Ignore the files *_CNtable.txt and Dupfile.txt in same directory.
rem Command goto :EOF just exits here from subroutine ProcessFile.
if "%FileName%"=="AP_CNtable.txt" goto :EOF
if "%FileName%"=="SS_CNtable.txt" goto :EOF
if "%FileName%"=="Dupfile.txt" goto :EOF

rem Get 7th, 9th and 14th element from first line of current file.
for /f "usebackq tokens=7,9,14 delims=~*^" %%a in ( "%FileName%" ) do (
   set "ISAsender=%%a"
   set "ISAreceiver=%%b"
   set "ISActrlnum=%%c"
   goto WriteToLogFile
)

:WriteToLogFile
rem Remove all spaces as ISAsender and ISAreceiver have
rem usually spaces appended at end according to example
rem text. Then write file name and the 3 values to log file.
set "ISAsender=%ISAsender: =%"
set "ISAreceiver=%ISAreceiver: =%"
set "ISActrlnum=%ISActrlnum: =%"
echo %FileName%,%ISAsender%,%ISAreceiver%,%ISActrlnum%>>EDI.log

if "%ISAsender%"=="APPLESND" (
    rem Check for ISA control number in file AP_CNtable.txt.
    %SystemRoot%\System32\Findstr.exe /X /M /C:%ISActrlnum% AP_CNtable.txt >nul
    if not errorlevel 1 goto Duplicate

    echo %ISActrlnum%>>AP_CNtable.txt

    if "%ISAreceiver%"=="APPLERCV" (
        move /Y "%FileName%" "APPLE"
        echo Moved %FileName% to directory APPLE.
    )
)

if "%ISAsender%"=="SAMSUNGSND" (
    rem Check for ISA control number in file SS_CNtable.txt.
    %SystemRoot%\System32\Findstr.exe /X /M /C:%ISActrlnum% SS_CNtable.txt >nul
    if not errorlevel 1 goto Duplicate

    echo %ISActrlnum%>>SS_CNtable.txt

    if "%ISAreceiver%"=="SAMSUNGRCV" (
        move /Y "%FileName%" "SAMSUNG"
        echo Moved %FileName% to directory SAMSUNG.
    )
)
rem Exit the subroutine ProcessFile.
goto :EOF

:Duplicate
rem This ISA control number is already present in file *_CNtable.txt.
echo Duplicate control %ISActrlnum% found in file %FileName%.
echo %ISActrlnum%,%FileName%>>Dupfile.txt

rem Exit the subroutine ProcessFile.
goto :EOF

목록 파일의 이름에 현재 날짜와 시간이 있어야하는 이유는 모르겠지만 알 수없는 이유로 보관하고 싶을 수도 있습니다. 이 경우 위의 코드에서 두 줄 del %ListFile%, 즉 명령이있는 줄과 위의 주석 줄 을 삭제해야합니다 .

해당 포인트 6의 변경 사항에 따라 2014-10-07에 배치 코드를 업데이트했습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관