簡體   English   中英

批處理文件遷移到Windows Server 2012 R2后未創建有效的日期變量

[英]Batch file not creating valid date variables after migration to Windows Server 2012 R2

我已成功使用以下.bat批處理文件從Windows Server 2003的“計划任務”中運行.php腳本:

@echo off

set phpdir=D:\PHP
set appclidir=D:\App\cli
set cronfolder=E:\CronLogs

pushd %cronfolder%

echo cronfolder is %cronfolder%

:: Start Time Function
Set "WT=%Time%"
Set time.HH=%WT:~0,2%
Set time.MM=%WT:~0,5%

Set time.AMPM=PM
If /I %time.HH% LSS 10 (
   Set time.HH=0%time.HH:~1,1%
)
If /I %time.HH% LSS 12 (
   Set time.AMPM=AM
   Set time.HH12=%time.HH%
)  Else (
   Set /a time.HH12=%time.HH%-12
)
If /I %time.MM% LSS 10 (
   Set time.MM=0%time.MM:~1,1%
)
:: End Time Function

:: Start Date Function
Set yyyy=%DATE:~2,2%
Set mm=%DATE:~5,2%
Set dd=%DATE:~8,2%

set currentdate=%yyyy%%mm%%dd%
echo currentdate is %currentdate%
:: End Date Function

:: Create a folder with todays date
if not exist %cronfolder%\%currentdate% (
    echo making folder %cronfolder%\%currentdate%
    mkdir %cronfolder%\%currentdate%
)
set filename=%currentdate%_%time.HH%.log
echo filename is %filename%

:: Run PHP cron script
%phpdir%\php.exe %appclidir%\cron.php | %appclidir%\wtee.exe -a %cronfolder%\%currentdate%\%filename%

popd

:: The End
pause
exit

它以當前日期作為文件夾名稱創建一個文件夾。 然后,它運行.php cron腳本,並將腳本的輸出回顯到具有YYMMDD_HH.log格式的文本文件中。 文件夾中每小時創建一個新的.log文件。 (因為它取決於服務器區域設置,所以並不完美,但這是可以管理的...)

將批處理文件移動到Windows Server 2012 R2之后,將無法正確創建YYMMDD_HH.log文本文件。 而是腳本在%cronfolder%目錄(D:\\ CronLogs)中生成一個字母文件(不帶.log文件擴展名)。

我得到的不是D:\\ CronLogs \\ 171103 \\ 171103_08.log這樣的隨機文件名, 而是D:\\ CronLogs \\ uD:\\ CronLogs \\ e這樣的隨機文件,因此生成日期/時間值的時間函數代碼顯然存在問題。

  1. 誰能發現問題?
  2. 這可以輕松轉換為PowerShell腳本嗎?

在Server 2012 R2上,變量%DATE%的值包括星期幾,因此%DATE:~2,2%將不會為您提供您期望的值:

C:\> echo %DATE%
Fri 11/03/2017
C:\> echo _%DATE:~2,2%_
_i _

您可以通過首先將日期字符串的后10個字符分配給temp變量來避免此問題:

set "TODAY=%DATE:~-10%"
set "yyyy=%TODAY:~8,2%"
set "mm=%TODAY:~0,2%"
set "dd=%TODAY:~3,2%"

是的,在PowerShell中可以更輕松地完成日期計算:

$currentdate = (Get-Date).ToString('yyMMdd')

AFAICS,您應該可以輕松地將批處理代碼轉換為PowerShell。

無論使用什么版本的Windows或區域設置,都可以使用此代碼始終以完全相同的格式獲取日期和時間。

格式將始終采用以下格式:20171103084739.006000-300 YYYYMMDDhhmmss。

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM