سؤال

في ملفي الخفافيش أريد أن تولد اسما فريدا الملفات / الدلائل على أساس تاريخ من الوقت.

ومنها مثلا.

Build-2009-10-29-10-59-00

والمشكلة هي أن %TIME% لن تفعل لأنه يحتوي على أحرف غير قانونية في اسم الملف (على سبيل المثال <م> : ).

هل هناك شيء من هذا القبيل tr في الملفات الدفعية؟

وأي أفكار أخرى كيفية حل هذه (التي لا تتطلب المزيد من المرافق سطر الأوامر بصرف النظر عن مترجم دفعة)؟

هل كانت مفيدة؟

المحلول

وتحرير: وهناك طريقة أفضل للقيام بذلك هو اتخاذ سلسلة تاريخ / الوقت له شكل محدد وثابت بدلا من استخدام تلك المعرفة من قبل لغة من %date% و%time%. يمكنك استخدام ما يلي للحصول عليه:

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x

وتعطي شيء من هذا القبيل 20120730203126.530000+120 ويمكنك استخدام ذلك لبناء أسماء الملفات الخاصة بك.


و(قديم الجواب أدناه)

ويمكنك ببساطة استبدال الطابع المخالف مع سلسلة فارغة:

echo %time::=%

وو%var:str1=str2% جملة يأخذ متغير البيئة (أو شبه المتغير في حالة %TIME% ويحل محل str1 التي كتبها str2. إذا كان أي شيء يتبع بعد علامة المساواة ثم يتم حذف str1 ببساطة.

في حالة معينة وأعتقد كنت تريد ما يلي:

rem cut off fractional seconds
set t=%time:~0,8%
rem replace colons with dashes
set t=%t::=-%
set FileName=Build-%date%-%t%

وهناك طريقة القوة الغاشمة أكثر في حال كنت لا أعرف ما إذا كان يتم استخدام كولون (ولكن ترتيب الوقت تكون هي نفسها):

set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2%

وجميع الأمور السابقة، ومع ذلك، يفترض أن استخدام معيار تنسيق التاريخ ISO 8601، ط. ه. 2009-10-29. كنت تحمل هذا الأمر ببساطة وضعها الطبيعي، ولكن بعض الناس استخدام الأشكال الأخرى لذا كن حذرا. ولكن منذ كنت لا تسأل عن تاريخ كنت على افتراض انك لم يكن لديك مشكلة هناك.

نصائح أخرى

ومتابعة @ جوي والأجوبةKees "لجعلها صالحة للاستعمال على الفور.

في سطر الأوامر:

FOR /f %a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%

في ملف BAT:

@echo off
REM See http://stackoverflow.com/q/1642677/1143274
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%

والناتج مثال:

2014-10-21_16-28-52

وأنا استخدم هذا إلى إنشاء اسم ملف فريد لتنفيذ الملف الدفعي.

REM ****Set up Logging ****
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%

set Logname="PCCU_%mydate%_%mytime%.log"
Echo.  >>%Logname% 2>>&1
Echo.=================== >>%Logname% 2>>&1

وكان لي لإضافة سطر

set mytime=%mytime: =0%

ولأنه كان نفس المشكلة حيث يتم إدخال فارغة قبل 10:00، وأنا الآن الحصول على 09 بدلا من 9. أنا أيضا إعادة استخدام٪ mydate٪ و٪ mytime٪ متغير عن الملفات الأخرى التي أقوم بإنشائها مع هذا السيناريو بحيث أنهم جميعا لديهم نفس طابع التاريخ والوقت.

وهذا الروتين، في الواقع سطر واحد فقط، ويعمل على كل نظام لتعيين أي تاريخ أو تنسيق الوقت.
الناتج من خط 1 في شكل 20140725095527،710000 + 120

ويتم تحديد تنسيق التاريخ / الوقت الفعلي الذي تحتاجه في خط 2. يمكنك تنسيق عليه كيفما تشاء.
فقط إضافة متغير التاريخ والوقت مما يؤدي إلى أي اسم الملف الخاص بك. Filename_٪ التاريخ والوقت٪ .LOG

::=======================================================================
::== CREATE UNIQUE DateTime STRING IN FORMAT YYYYMMDD-HHMMSS
::=======================================================================
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a

SET DateTime=%DTS:~0,8%-%DTS:~8,6% | REM OUTPUT = 20140725-095527

وأنا جعلت هذا العالمية، سوف تعمل على أي بيئة حيث تنسيق التاريخ قد تكون مختلفة.

echo off
if not exist "C:\SWLOG\" mkdir C:\SWLOG
cd C:\SWLOG\
cmd /c "powershell get-date -format ^"{yyyyMMdd-HHmmss}^""> result.txt
REM echo %time% > result.txt
type result.txt > result1.txt
set /p filename=<result1.txt
echo %filename%
del C:\SWLOG\result.txt
del C:\SWLOG\result1.txt

لجعل رمز في المثال العمل السابق، وكنت بحاجة الى تعديل طفيف. أفترض ذلك لأن جهاز الكمبيوتر الخاص بي يستخدم تنسيق تاريخ المملكة المتحدة. للحصول على العودة "2014/04/19" في mydate I المطلوبة:

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)

وفيما يلي لقد لصق مخطوطتي الكلي، وشملت مثال على كيفية استخدام اسم الملف

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%

set Logname="c:\temp\LogFiles\MyLogFile_%mydate%_%mytime%.log"
Robocopy  \\sourceserver\Music H:\MyBackups\Music /MIR /FFT /Z /XA:H /W:5 /np /fp /dcopy:T /unilog:%Logname% /tee 

وآمل أن يساعد هذا!

إذا كنت تستطيع <م> الضمان أن الجهاز يحتوي على إصدار محدد من بيثون تثبيت على ذلك، ويمكن الوصول إليها في PATH النظام، يمكنك استخدام هذا الحل:

FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import datetime; print 
datetime.datetime.now().replace(microsecond=0).isoformat().replace(':', '-')"`) DO (
SET TIMESTAMP=%%F
)
ECHO %TIMESTAMP%

وهذا سيضع ISO-8601 (العش) تاريخ التمثيل في %TIMESTAMP% متغير وصدى بها، كما يلي:

2017-05-25T14:54:37

ولقد وضعت replace(':', '-') بعد isoformat() بحيث السلسلة الناتجة يمكن استخدامها في اسم ملف أو دليل، منذ : هو شخصية وممنوع في نظام الملفات ويندوز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top