2016-08-24 3 views
0

シナリオを見つけるために:私たちは、製品の複数のリリースを持っている 、および各リリースのために、フォルダがメインフォルダに作成されます。ヘルプファイルは、さまざまなリリースで変更されています。私はすべてのヘルプファイル名をテキストファイルにリストアップしています。バッチスクリプトはテキストファイルからファイル名を選択し、最新のファイル

  1. filenames.txtファイルから各ファイル名を取る
  2. ディレクトリ全体でその名前のファイルを検索する(すべてのリリースで)
  3. 最新のファイル
  4. を探す:私はへのスクリプトが必要
  5. は、このコードを取得するために私はスタックオーバーフローで見つけたコードのさまざまな部分からの助けを取っ指定したフォルダ

にそれをコピーして、それらを組み合わせた:

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
echo. 
FOR /F "usebackq delims=" %%a in ("filenames.txt") do (
     SET "x=%%a" 
     ECHO '!x!' 
     SET FFPath=C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN 
     SET NewPath=C:\Lavanya\extracted 
     SET NewestDate=20160824 
     ECHO Recursively searching %FFPath% 
     FOR /F %%I in ('DIR %FFPath%\ !x! /a:-d /s /b') DO (
      SET FullDate=%%~tI 
      ECHO %FFPath% 
      REM Set CurrDate to yyyymmdd format. Note: Will fail if regional settings changed. 
      SET CurrDate=!FullDate:~6,4!!FullDate:~0,2!!FullDate:~3,2! 

      If !CurrDate! gtr !NewestDate! (
       SET NewestDate=!CurrDate! 
       SET NewestFile=%%~fI) 
      ECHO Copying %NewestFile% to %NewPath% 
      ECHO. 
      COPY /Y "%NewestFile%" "%NewPath%" 
      ECHO. 
    ) 
) 
PAUSE 

このコードは動作しません。そして、私はエラーを理解することができません。

+0

あなたは 'DIR%FFPath%\ xを交換しなければならない' 'DIRと'!! "%FFPath%\ X!"。 'dir'はスペースで区切られた複数のマスクを検索します(例:' dir * .txt * .jpg'はすべての* .txtファイルとすべての* .jpgファイルを表示します) – Stephan

+1

_all_に設定された変数_ループ内で読んでください!そして、単に 'dir'を日付('/o:d')でソートさせるのはなぜですか... – aschipfl

+0

@Stephanあなたが提案した変更を試みましたが、期待通りの結果を得られませんでした。解決策を見つける他の方法はありますか?クエリを調べる時間をとってくれてありがとう! – Lavanya

答えて

0

wmicコマンドを使用して、最後の変更日時をロケールに依存しない方法(たとえば、20160824115500.000000+060)で取得するために、最も最近変更されたファイルを検索するスクリプトです。

リストファイル.\filenames.txtから読み取られたすべてのファイル名に対して、ディレクトリC:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLNにルーティングされたディレクトリツリーで、一致するファイルが再帰的に検索され、それぞれの変更日時が収集されます。そのフォーマットのために、単純なより大きい(GTR)比較は、それがキャッシュされたものよりも遅い時点であるかどうかを判断することができる。基準が満たされると、キャッシュはそれに応じて更新される。

大文字のREMECHOコマンドは、ファイルに対して実行される実際のアクションのプレースホルダのみを構成します。必要に応じてスクリプトを拡張します。変数!LASTFILE!には、検出された各ファイルの絶対パスが格納されます。だからここ

は、コードは次のとおりです。

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "LOCATION=C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN" 
set "FILELIST=.\filenames.txt" 
set "WMICPROP=LastModified" & rem // {CreationDate | LastAccessed | LastModified} 

pushd "%LOCATION%" || exit /B 1 
for /F "usebackq eol=| delims=" %%L in ("%FILELIST%") do (
    set "LASTFILE=" 
    set "LASTFAGE=00000000000000.000000+000" 
    for /F "eol=| delims=" %%F in ('dir /B /S /A:-D "%%~L"') do (
     set "FILE=%%F" 
     setlocal EnableDelayedExpansion 
     set "FILE=!FILE:\=\\!" 
     for /F "tokens=2 delims==" %%J in (' 
      2^> nul wmic DataFile WHERE ^(Name^="!FILE!"^) GET %WMICPROP% /VALUE ^|^|^
       2^> nul wmic DataFile WHERE Name^="!FILE!" GET %WMICPROP% /VALUE 
     ') do for /F %%I in ("%%J") do (
      endlocal 
      set "FAGE=%%I" 
      setlocal EnableDelayedExpansion 
      if !FAGE! GTR !LASTFAGE! (
       endlocal 
       set "LASTFILE=%%F" 
       set "LASTFAGE=%%I" 
       setlocal EnableDelayedExpansion 
      ) 
     ) 
     endlocal 
    ) 
    if defined LASTFILE (
     setlocal EnableDelayedExpansion 

     REM Do whatever you want with the file here... 
     ECHO Newest file: "!LASTFILE!" 

     endlocal 
    ) 
) 
popd 

endlocal 
exit /B 
+0

私はこのコードを全く同じように使用しました。 filenames.txtファイルが置かれているのと同じ場所に、test3.batファイルにコードを保存しました。ファイルをダブルクリックすると、コマンドプロンプトウィンドウが開きませんでした。そこで、cmdウィンドウで 'cd'コマンドを使用してフォルダに移動し、test3.batファイルを実行しました。 「システムがファイル。\ filenames.txtを見つけることができません」というエラーが表示されます。 :-(filenames.txtファイル内のファイル名は次のようになります。 tsacm0100m000 tsacm0110m000 tsacm0410m000 tsacm1101m000 987そのような行がファイルで使用可能な – Lavanya

+0

をfilenames.txt'が同じ場所にある '場合。バッチファイルとして、 'set" FILELIST =。\ filenames.txt "'を 'set"に置き換えてください。FILELIST =%〜dp0filenames.txt "' ... – aschipfl

関連する問題