FileListを取得し、文字列操作の入力としてファイル名を使用して、バッチファイルを使用した状態にありますか? -- windows フィールド と batch-file フィールド 関連 問題

How to get filelist and use the filename as input for string manipulation (duplicate checking) & condition using batch file?












0
vote

問題

日本語

私はWindowsバッチファイルを作成しようとしています。

1:現在のディレクトリ内のファイルをリストし、FileNameListへの出力(FileList_ [YYY] [MM] [DD] [MM] [MM] SS])

第2:与えられたFileNameListから、各行を3次元ステップ

の入力として読み込む

3RD:ファイルの最初の行を読み、7番目、9番目、および14番文字列を抽出します。

<事前> <コード> Delimiter can be "~", "*" and "^"

4th:IsaSender変数として7番目、isAreceiverとして9th、isactrlnumとして14番文字列を割り当てます。

5th:エコー変数を単一のログファイル(edi.log)にリダイレクトします。

編集: 6th:ISASENDERのCNTable.txt(ex.ap_cntable.txt for ap_cntable.txt、samsungsnd for samsungsndはss_cntable)をチェックしてください。isactrllnumは既に存在しているか複製されています。最初は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の条件を使用して、ファイルをcorrespoIndingフォルダに移動します。 第8回:第2ステップがEOFに達するか、または各線の読み終了まで3RD-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

ISACTRLNUM = 000000001はcntable.txtに存在しないため、ISACTRLNUMを追加してcntable.txtを更新します。ここでは、ISASENDERとISARECEIVERの条件付きステートメントのみが利用されます。 そのため、ISASERDER = APPLESTとISARECEIVER = APPLECVの場合、C: VP Appleのような特定のディレクトリに、exererファイル(filename.txt)を特定のディレクトリに移動します。 FileList_20141022010101内の次のファイル名のための同じ論理。

私は以下のコードを書くことができましたが、ファイル名をForFilesから取得する方法はわかりませんでした。

<事前> <コード> 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:VPAPPLE" ) if %ISAsender%=="SAMSUNGSND" if %ISAreceiver=="SAMSUNGRCV" ( move FileName.txt "C:VPSAMSUNG" )

重複するコントロール番号(ISACTRLNUM)をチェックする別のバッチファイルを呼び出すことなく、要件を満たすのに役立つことができますか? できるだけ多くのコード全体のBATファイルを必要とします。私の長い説明を持ってくる。

英語

I am trying to create a windows batch file that will:

1st: List files in current directory and output to a filenamelist (Filelist_[YYY][MM][DD][hh][mm]ss])

2nd: From the given filenamelist, read each line as an input for 3rd step

3rd: Read the first line of the file and extract 7th, 9th, and and 14th string.

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

4th: Assign 7th as ISAsender variable, 9th as ISAreceiver, and 14th string as ISActrlnum.

5th: Redirect the echoed variables to a single logfile (EDI.log).

EDIT: 6th: Check ISAsender's CNtable.txt (Ex. AP_CNtable.txt for ISA's APPLESND, SS_CNtable for SAMSUNGSND) if ISActrlnum already exists or duplicate. Initially CNtable.txt contains dumped values of ISActrlnum (control numbers).

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: Use IF condition for ISAsender and ISAreceiver to move the file to a correspoinding folder. 8th: Repeat 3rd-7th until 2nd step reaches EOF or finished reading each lines.

Example: From a given Filelist_20141022010101, FileName.txt contains the following having "~" as delimiter:

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 

while CNtable.txt contains:

000000004 000000002 000000003 000000005 

Since ISActrlnum=000000001 does not exist in CNtable.txt, it will update CNtable.txt by appending ISActrlnum. Here only conditional statements for the ISAsender and ISAreceiver will be utilized. So if ISAsender=APPLESND and ISAreceiver=APPLERCV move the curent file (FileName.txt) to specific directory such as C:VPAPPLE. Same logic for the next filename inside Filelist_20141022010101.

I was able to write code below but don't know how to get the filename from FORFILES and use it again as variable input in the 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:VPAPPLE"     )  if %ISAsender%=="SAMSUNGSND" if %ISAreceiver=="SAMSUNGRCV"    (     move FileName.txt "C:VPSAMSUNG"     ) 

Can anyone help me to satisfy the requirement without having to call another batch file that checks the duplicate control numbers (ISActrlnum) ? As much as possible I want the whole code in a single bat file. Please bear with my lengthy description.

</div
     

回答リスト

0
 
vote
vote
ベストアンサー
 

私はあなたのコンピュータ上にあなたが持っている環境全体を設定する必要がありましたが、あなたのバッチファイルを再記録しましたが、私はそれを得たと思います。

コメントを読み取る - rem から始まる行は、バッチファイルを理解し、必要な場合は環境に適応させます。

<事前> <コード> setContentView0

リストファイルに名前の現在の日時が必要なのかわからないが、おそらくあなたはそれを何らかの不明な理由で保持したいのです。この場合、上記のコードで2行を削除する必要があります。コマンド setContentView1 と上記のコメント行との線。

2014-10-07でバッチコードを更新しました。

 

I needed to setup the entire environment you have on your computer to recode your batch file, but I think I got it.

Read the comments - the lines starting with rem - to understand the batch file and adapt it to your environment if this necessary.

@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%System32wbemwmic.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%System32Findstr.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%System32Findstr.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 

I'm not sure why the list file must have the current date and time in name, but perhaps you want to keep it for some unknown reason. In this case it would be necessary to delete 2 lines in code above - the line with command del %ListFile% and the comment line above.

Updated batch code on 2014-10-07 according to changes on point 6 in question.

</div
 
 
   
   

関連する質問

0  バッチファイルをコーディングして最後にDateDファイルをコピーして名前変更する方法  ( How to code a batch file to copy and rename the most recently dated file ) 
ローカルマシン上の別のディレクトリに特定のフォルダ内の最後にDateDファイルのみをコピーするためにバッチファイルをコーディングしようとしています。 ここで非常に似た質問を見つけました ディレクトリから最新のファイルをコピーするには、Windowsバッチスク...

78  「Enterキーを押して終了」を行う方法  ( How to do press enter to exit in batch ) 
私はRakeを使ってプロジェクトを構築し、これに似たbuild.batファイルを持っています: <事前> <コード> @echo off cls rake build.batをダブルクリックすると、DOSウィンドウがポップアップし、すべての進行状況を表示...

0  Windowsの名前を変更します  ( Windows rename sub folders command ) 
これがこのような質問の適切な場所であるかどうかは確かないが、ここでは行きます。 のフォルダ構造を持っています ParentFolder / Folder1 / 10-31-2010 / file1.pdf <事前> <コード> /fold...

2  batch-fileからのコマンドライン引数の短いファイル名を取得する  ( Getting short filename of command line argument from batch file ) 
バッチファイル内の次のコマンドは、期待/希望通りに機能しません。 <コード> echo %~nxs1 > これが私が取得しようとしているもののサンプル表示です: <事前> <コード> C:>type test.bat @dir /b %1 @ech...

1  バッチスクリプトでgitコマンドを使用する場合、エラーに失敗する方法は?  ( When using git commands in batch script how to fail on error ) 
以下は、GIT操作のセットを実行しているバッチスクリプト、Git CheckoutのようなGITエラーで失敗する方法「ブランチは既に終了しています」 `` `` `` ` <事前> <コード> REM arg 1 = branch to copy REM a...

3  ビットごとに、バットファイルを作るにはどうすればよいですか。  ( How do i make a bitwise and in a bat file ) 
私は次のようにしてみましたが、「&amp;現時点では予想外でした。」 <事前> <コード> @echo off :enter-input echo Please enter a number between 1 and 15: echo 1 = Selecti...

0  Regexでfindstrを使用している場合、CMDバッチファイルの「この時期に予期しない」エラーが発生しました  ( Was unexpected at this time error on cmd batch file when using findstr with r ) 
このバッチスクリプトを持っています: <事前> <コード> setlocal enableDelayedExpansion set filename=%1% set archive=%2% set aleph=%3% set bet=%4% set gime...

0  2つの連続した線がほぼ同じ場合はテキストファイルを分割する  ( Split a text file if two consecutive lines almost identical ) 
前の行の文字列の内容(位置2から13まで)と現在の行の文字列の内容に基づいてテキストファイル(.batコマンドを使用)を分割する必要があります(位置2から)。 13)... 説明: 私のファイルはそのように見えます: <事前> <コード> IA1234567...

4  リモートコンピュータでバッチファイルを実行する方法  ( How to execute a batch file on a remote computer ) 
ビルド出力とバッチファイルがビルドマシンに住んでいるビルドの後、リモートコンピュータでバッチファイルを実行できるようにしたいと思います。 つまり、リモートコンピュータ上で実行されているバッチファイルは、UNCパスを介して入手可能なビルドサーバーに配置されていま...

6  Windows用のDOSバッチファイルのアップグレード  ( Upgrading dos batch files for windows ) 
Windowsボックス上の自動DOSバッチスタイルタスクをプログラミングするための最近の要件があったことがありますか? 自動化を行うためにいくつかの自動化を得ています、そして、私はメモ帳で座って座っていない。これらのタスクを自動化するためのより良い方法がある...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有