我认为没有必要延迟扩展。
只需在 Dir 循环之前创建您的 DateTime 字符串 %dt%:脚本的时间当然每个都相同,但 IMO 每个 gsutil 命令结束的确切时间不应该是任务关键,批处理运行时间应该是。
@Echo Off
SetLocal EnableExtensions
Set "sd=C:\files"
Set "fg=*.vib"
For /F EOL^=L %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS GET LocalDateTime'
) Do For %%H In (%%~nG) Do Set "dt=%%H"
Set "dt=%dt:~4,2%-%dt:~6,2%-%dt:~,4%_%dt:~8,2%-%dt:~10,2%-%dt:~-2%"
For /F "EOL=? Delims=" %%G In ('Dir "%sd%\%fg%" /B /A:-D /O-D 2^> NUL') Do (
gsutil.exe cp "%sd%\%%G" "gs://mybucket"
Echo %dt% file %%G was uploaded)
Pause
GoTo :EOF
如果您确实需要记录每个文件单独处理后的时间,只需直接在同一个for循环中进行:
@Echo Off
SetLocal EnableExtensions
Set "sd=C:\files"
Set "fg=*.vib"
For /F %%G In ('Dir "%sd%\%fg%" /B /A:-D /O-D 2^> NUL') Do (
gsutil.exe cp "%sd%\%%G" "gs://mybucket" && (
For /F "Tokens=1-6 Delims=/: " %%H In (
'%SystemRoot%\System32\Robocopy.exe \: . /NJH /L ^
^| %SystemRoot%\System32\find.exe " 123"') Do (
Echo %%I-%%J-%%H_%%K-%%L-%%M file %%G was uploaded)))
Pause
GoTo :EOF
[编辑 /]
以防万一您的gsutil 不带有.exe 扩展名,并且期望它返回0 的错误级别以获得成功的cp,这是对相同代码的轻微修改。
@Echo Off
SetLocal EnableExtensions
Set "sd=C:\files"
Set "fg=*.vib"
For /F %%G In ('Dir "%sd%\%fg%" /B /A:-D /O-D 2^> NUL') Do (
gsutil cp "%sd%\%%G" "gs://mybucket"
If Not ErrorLevel 1 For /F "Tokens=1-6 Delims=/: " %%H In (
'%SystemRoot%\System32\Robocopy.exe \: . /NJH /L ^
^| %SystemRoot%\System32\find.exe " 123"') Do (
Echo %%I-%%J-%%H_%%K-%%L-%%M file %%G was uploaded))
Pause
GoTo :EOF
出于礼貌,(我看不出你为什么不能使用 Robocopy.exe),这是一个使用 cscript.exe 通过 JScript 生成日期时间戳的版本。
@if (@X) == (@Y) @end /*
@Echo Off
SetLocal EnableExtensions
Set "sd=C:\files"
Set "fg=*.vib"
For /F %%G In ('Dir "%sd%\%fg%" /B /A:-D /O-D 2^> NUL') Do (
gsutil cp "%sd%\%%G" "gs://mybucket"
If Not ErrorLevel 1 For /F %%H In (
'%SystemRoot%\System32\cscript.exe /NoLogo /E:JScript "%~f0"') Do (
Echo %%H file %%G was uploaded))
Pause
GoTo :EOF */
var d = new Date();
WScript.Echo (("0" + (d.getMonth() + 1)).slice(-2) + "-" +
("0" + d.getDate()).slice(-2) + "-" + d.getFullYear() + "_" +
("0" + d.getHours()).slice(-2) + "-" +
("0" + d.getMinutes()).slice(-2) + "-" + ("0" + d.getSeconds()).slice(-2));
[Edit2 /] 基于新的问题标准,在下面的 cmets 中
@Echo Off
SetLocal EnableExtensions
Set "sd=C:\files"
Set "fg=*.vib *.vbk"
PushD "%sd%" 2> NUL || GoTo :EOF
For /F %%G In ('Dir %fg% /B /A:-D /O-D 2^> NUL') Do (
If /I "%%~xG" == ".vbk" GoTo Done
gsutil cp "%%G" "gs://mybucket"
If Not ErrorLevel 1 For /F "Tokens=1-6 Delims=/: " %%H In (
'%SystemRoot%\System32\Robocopy.exe \: . /NJH /L ^
^| %SystemRoot%\System32\find.exe " 123"') Do (
Echo %%I-%%J-%%H_%%K-%%L-%%M file %%G was uploaded))
:Done
PopD
Pause
GoTo :EOF