2

私は2つのファイルの日付を評価するバッチファイルのいくつかのコードに取り組んできました。一方の日付がもう一方の日付よりも大きい場合は、別のbatファイルを実行します。私がやりたいのは、2つの日付をYYYYMMDDとしてフォーマットして、GTRより大きい)を使用できるようにすることです。

コードは以下のとおりですが、文字列を評価しているため、==equal )を使用すると機能します。1つのファイルの日付が他のファイルの日付よりも大きいかどうかだけを知りたいです。

以下のコードを修正してくれる人を求めているわけではありませんが、日付のフォーマット方法を教えていただければ幸いです。


set Fileone=File1.txt
set FileTwo=File2.txt

pushd "D:\Board\Broadcast\FA_Report8_A"
FOR %%f IN (%FileOne%) DO SET filedatetime=%%~tf
FOR %%f IN (%FileTwo%) DO SET filedatetime2=%%~tf
SET filedatetime2=%year%%month%%day%
IF %filedatetime:~0, 10% GTR %filedatetime2:~0, 10% ( 
echo FileOne Greater - run bat
timeout /t 20 /nobreak
goto Finish
) else (
echo FileOne not Greater - Finish
goto Finish
)
:Finish
echo finished 
pause
4

3 に答える 3

10

日付形式が異なるマシン間では移植できませんが、最も簡単な方法はサブストリングを使用することです。%var:~STARTPOS,LENGTH%

set filedatetime=14/06/2012 12:26
set filedatetime=%filedatetime:~6,4%%filedatetime:~3,2%%filedatetime:~0,2%
echo "%filedatetime%"

"20120614"
于 2012-06-18T13:12:05.477 に答える
2

FOR / Fコマンドを使用して、日付をその部分で区切ることができます。

set filedatetime=14/06/2012 12:26
for /F "tokens=1-3 delims=/ " %%a in ("%filedatetime%") do (
   set filedatetime=%%c%%b%%a
)

このフォームは、各サブストリングの位置やサイズを間違えることを防ぎ、パーツの順序を非常に簡単に変更できます。たとえば、日付がMM / DD / YYYYの場合:

set filedatetime=%%c%%a%%b

FOR /?と入力します 詳細については。

于 2012-06-19T04:05:37.373 に答える
1

システム内の日付変数文字列のレイアウトは、ユーザーからの設定、地域や言語によって想定できるため、日付は100%予測可能なレイアウトではありません。


wmic OS Get localdatetime /value結果は100%予測可能であるため、使用してみてください。

LocalDateTime=20190609123708.733000-180

したがって、forループを使用して、、=.(equalとdot)のような2つの区切り文字を追加すると、次の文字列出力が得られます。

20190609123708

このコマンドのレイアウトは予測可能であり、地域の設定、ユーザー設定、またはシステム言語に関係なく機能するため、コマンドは常に次の値を返します。

set _date=20190609123708
rem :: %_date:~0,4%_%_date:~4,2%_%_date:~6,2%
rem ::   year:2019 |  month:06  | day:09

バットファイル:

 @echo off & for /f "tokens=2delims==." %%i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do set "_date=%%i" & echo/%_date:~0,4%%_date:~4,2%%_date:~6,2%

コマンドライン:

for /f "tokens=2delims==." %i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do set "_data=%i" & mkdir %_date:~0,4%_%_date:~4,2%_%_date:~6,2%

このコマンドの結果::

    20190609


私も提案することができます:

wmic Path Win32_LocalTime Get Day,Month,Year 

ループ中:

@echo off & setlocal enabledelayedexpansion & set "_do=wmic Path Win32_LocalTime Get Day^,Month^,Year" 
for /f "tokens=1-3delims= " %%a in ('!_do!^|findstr /r [0-9]')do set "y=%%c" & set "d=0%%a" & set "m=0%%b"
echo/!y!!m:~-2!!d:~-2! >nul 

結果:

Day  Month  Year
 9   6      2019 
%%a  %%b    %%c

月/日の数が9未満の場合、差はゼロではないため、このバットを使用して、この場合の先行ゼロを設定できます。

@echo off & setlocal enabledelayedexpansion & set "_do=wmic Path Win32_LocalTime Get Day^,Month^,Year" 
for /f "tokens=1-3delims= " %%a in ('!_do!^|findstr /r [0-9]')do set "y=%%c" & set "d=0%%a" & set "m=0%%b"
echo/!y!!m:~-2!!d:~-2!

YearMonthDayの結果:

20190609

Obs .: PowerShellでは、次の方法でレイアウトを簡単にカスタマイズできます。

ToString("yyyyMMdd")

文字列は。で設定できますToString

サンプル: yyyy-MM-dd, dd-MM-yyyy, MM-dd-yyyy, MM_dd_yyyy, yyyy_MM_dd, etc..


Powershellコマンド:

$(Get-Date).ToString("yyyyMMdd")

結果:

2010609

バッチでの日付変数レイアウト出力の詳細については、こちらをご覧ください。

当日の月と年をバッチで取得する安全な方法

バッチファイルと地域設定/ロケールでの日付の解析



更新-上記のコメント/観察をバットにどのように適用するか、つまり、この質問のコードを理解した場合:


@echo off & setlocal enabledelayedexpansion 

set "Fileone=File1.txt" &  set "FileTwo=File2.txt"

set "_both=!FileOne!-!FileTwo!" & rem cd /d "D:\Board\Broadcast\FA_Report8_A"

set "_path_back=%__CD__%" & rem :: you can use this "%__CD__%" or pushd "D:\Board\Broadcast\FA_Report8_A" 

for /f "tokens=2delims==." %%i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do set "_date=%%i"

set _now=!_date:~0,4!!_date:~4,2!!_date:~6,2! & for /f "tokens=1*delims=-" %%i in ('echo/!_both!')do (

     call :compare "%%~fi" & call :compare "%%~fj" & if !_dt_file_2! gtr !_dt_file_2! ( 
     
         echo/ FileOne Greater - run bat & timeout /t 20 /nobreak & goto :run_bat
         
         ) else (echo/ FileOne not Greater - Finish & goto Finish) 

    )
    
:compare
set "_file="  & set "_file=%~1" 

for /f "tokens=1delims=. " %%d in ('wmic datafile where name^='!_file:\=\\!' get LastModified ^|findstr /v "LastModified"')do (
    
    if "!_dt_file_1!./" == "./" (set _dt_file_2=%%d) else (set _dt_file_2=%%d)
    
    ) & exit /b

:run_bat 
call the_bat_to_run.cmd 

:Finish
echo/Finished

私の限られた 英語でごめんなさい...

于 2019-06-10T01:57:45.263 に答える