%time%変数を使用するバッチスクリプトの先頭にゼロが必要です


26

ファイルの命名に日付と時刻のデータを使用するDOSスクリプトのバグに出会いました。問題は、時間変数が時間<10に対して先行ゼロを自動的に提供しなかったためにギャップが発生したことでした。

誰でもこれを修正するために条件付きで先行ゼロをパディングする方法を知っていますか?

詳細:ファイル名設定コマンドは次のとおりです。

set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

C:\ Temp \ robolog_20100602_ 93208.log(午前9時23分)になります。

この質問はこれに関連しています。

ありがとう


パディングされた時間値を取得することが可能です... FOR / F "TOKENS = 1 DELIMS =:" %% A IN( 'TIME / T')DO SET HH = %% A then replace%time:〜0,2% %HH%を使用すると、よりコンパクトなソリューションを期待していましたが、これは機能します。
イラ

「よりコンパクトな」ソリューションは、別の言語の何か(powershell?python?perl?WSH?)です。
-grawity

私が使用するソリューションとしてジェシーの答えをマークするために切り替えました。先行する0でパディングする正午前と、正午以降の軍事時の両方で機能します。
イラ

回答:


60

非常に簡単な方法は、先頭のスペースをゼロに置き換えることです:
echo %TIME: =0%
出力:
09:18:53,45


1
できます!これは私が考える最も簡単な解決策..です
aerobrain

これは複数のキャラクターでもできますか?すべての '、'、 ''、および ':'。現在、中間変数を作成していますが、もちろんこれは、置換の数が少ないためにのみ機能します。さらに面倒です。
デボラス

1
私は営業時間を変更するために、第2の「ステップ」で、これを使用しています。set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%また、参照ss64.com/nt/syntax-replace.html
ハンドル

+1これは最短/最良の回答です。使用方法:set timestring=%TIME: =0%サブコールの初期- timestring代わりに(または使用する変数)を操作するだけです。
bshe

14

私の解決策は、次のアイデアを使用することでした:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%

私はそれが好きです。シンプルで直感的。
ケン14

最新のウィンドウで動作しますが、サーバー2003では構文エラーが発生します!
BDOアダムス博士

2008年以降、最もエレガントなソリューションで問題なく動作します。ありがとうございました。
bjoster 16

1
but gives syntax error on server 2003-なぜあなたは2016年にそれを気にしますか?
マルシンオルロフスキー

Windows 10コマンドプロンプトに最適
マイクアップジョン

5

デニスの答えと同様の考え。問題は、の幅%time%が常に同じであるため、短い文字列を返す代わりにスペースを先頭に挿入することです。

あなたはそれを取り除くことができますfor

for /f "delims= " %x in ("%time%") do set T=0%x

残りは多かれ少なかれ同じです。


2
このソリューションは、10>のために動作しますが、今「010」10のために作成されます...
Devolus

3
ジェシーからの答えが正しいものである...
サイモンSobisch

これは非常に悪い答えです。1時間に2桁あるとすぐに壊れます。OPがそれを選択したとは信じられません。
thebunnyrules

3

Jesseのコントリビューションを使用して、出力を変更した変数を作成しました。次に、その変数を参照して時間部分を作成します。

set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log 
pause

元のソースで:

set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log

ジェシーありがとう。評判ポイントがあれば投票したでしょう。


1

上記のすべてを実装する最もコンパクトなソリューションについては、

FOR / F "トークン= 1-4 DELIMS = /" %% A IN( "%DATE%")DO / F "TOKENS = 1-3 DELIMS = :." %% E IN( "%TIME:= 0%")DO SET logfile = C:\ Temp \ robolog _ %% D %% C %% B _ %% E %% F %% G.log

スクリプトに新しい行を追加せずにここで動作します。ただし、複数のコマンドソリューションよりもエレガントではないかもしれません。


1

以下はさらに数行を取りますが、明確で理解しやすいです。stdoutとstderrを別々のファイルに保存し、それぞれにタイムスタンプを付けます。タイムスタンプには、年、月、日、時間、分、秒がこの順序で含まれます。タイムスタンプには、常に最も重要な日付コンポーネントを最初(年)に、最小コンポーネント(秒)を最後にする必要があります。これにより、ファイルのリストを時間順に並べることができます。さらに苦労せずに、ここに私の解決策があります。

:prepare time stamp 
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " "  set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%

:run the program 
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
               2> RunLogs\err.%timeStamp%

0

これにより、時刻の先頭にゼロが追加され、時間の最後の2桁が取得されます(分と秒の開始位置が1つシフトされます)。したがって、午前3時は「03」、「03」になり、時間15は「015」、「15」になります。

set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log

読みにくい:

set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log

1
これが機能するかどうかわかりません。「set T = 0%time%」を実行し、午前9時38分である場合、エコー%T%は「0 9:38:54.21」を返します。その後、%T:〜1,2%を取得するとスペースが取得され、先行はありません0.
イラ

0

1行のコードで必要なことを実行できます。

    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%

たとえば、%Date%を使用し、使用する変数に先頭のゼロを追加して、%Time%の先頭のスペースをゼロに置き換える必要があるかどうかを判断します。

    ::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    Echo Started on %Date$ at %TimeStamp%

    :: Insert what you are doing here...

    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    ECHO Finished on %Date% at %TimeStamp%

0

これにより、ソート可能なタイムスタンプが作成され、2行目で1桁の時間などにスペースがないことを確認して、スクリプトで使用できるようにします。

set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%

出力:

2018.02.26__9.47.34


0

上からの助けに感謝...これは私が使用しているものです:

C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43

次に、このようなRobocopyジョブで呼び出されるログがあります。

このような多くのものがあります:

Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt

これでジョブを終了します。

REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log

COMPLETE_LOG_2018-06-27_10_53_54.log 最後に生成されるファイルで、ファイル名でソートできます。


0

Jesseの答えは、時間フィールドのスペースをなくすことで、ファイル名の変更の問題を解決しました。これが私の変数の設定方法です:

for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b

チャンピオンのように機能します。何らかの理由で日付は同じ処理を必要としませんでしたが、それは地域の設定に起因すると思います。


0
    @echo off



    call :PAD aaa,2,0,grw
    echo [[aaa=%aaa%]]
    pause




rem #### Function PAD ####
    goto :PADEND
    :PAD <var>,<length>,<padchar>,<string>
        set padtot=%~2
        set padchar=%~3
        set padString=%~4
        :StartPADLOOP
            call :len lenpadString,%padString%
            if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
            set padString=%padchar%%padString%
            goto :StartPADLOOP
        :EndPADLOOP
        set %~1=%padString%
    GOTO :EOF
    :PADEND


rem #### Function LEN ####
    goto :LENEND
    :LEN <var>,<string>
        set LENtempvar=%~2
        rem echo {{S:%LENtempvar%}}
        set LENCOUNT=0    
        :startLENLOOP
            if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
            rem echo {{A:%LENtempvar%}}
            set LENtempvar=%LENtempvar:~0,-1%
            rem echo {{B:%LENtempvar%}}
            set /a LENCOUNT=LENCOUNT+1
        goto :startLENLOOP
        :endLENLOOP
        set %~1=%LENCOUNT%
    GOTO :EOF
    :LENEND

-2
set sFolderName=%time: =0%
xcopy "%UserProfile%\Pictures\*.jpg" Y:\"%DATE%-%sFolderName:~0,2%h%time:~3,2%m%time:~6,2%s-%random%" /I /C /Y

15.06.2015-03h43m34s-5357

5357-%random%"

5
コードは高く評価されますが、常に付随する説明が必要です。これは長くする必要はありませんが、予想されます。
ペテルは、モニカを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.