كيف أكتب برنامج نصي دفعي لـ Windows لنسخ أحدث ملف من الدليل؟

StackOverflow https://stackoverflow.com/questions/97371

  •  01-07-2019
  •  | 
  •  

سؤال

أحتاج إلى نسخ أحدث ملف في الدليل إلى موقع جديد.لقد وجدت حتى الآن موارد على ملفات تعريفية أمر، أ سؤال متعلق بالتاريخ هنا، وآخر سؤال ذو صلة.أنا فقط أواجه مشكلة صغيرة في تجميع القطع معًا!كيف يمكنني نسخ أحدث ملف في هذا الدليل إلى مكان جديد؟

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

المحلول

غلاف النوافذ، بطانة واحدة:

FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT

نصائح أخرى

تعطي الإجابة المقبولة مثالاً على استخدام أحدث ملف في أمر ثم الخروج.إذا كنت بحاجة إلى القيام بذلك في ملف بات مع عمليات معقدة أخرى، فيمكنك استخدام ما يلي لتخزين اسم الملف لأحدث ملف في متغير:

FOR /F "delims=|" %%I IN ('DIR "*.*" /B /O:D') DO SET NewestFile=%%I

يمكنك الآن الرجوع إلى %NewestFile% في بقية ملف الخفافيش الخاص بك.

على سبيل المثال، إليك ما نستخدمه للحصول على أحدث إصدار من ملف .bak لقاعدة البيانات من دليل، ونسخه إلى خادم، ثم استعادة قاعدة البيانات:

:Variables
SET DatabaseBackupPath=\\virtualserver1\Database Backups

echo.
echo Restore WebServer Database
FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET NewestFile=%%I
copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\"

sqlcmd -U <username> -P <password> -d master -Q ^
"RESTORE DATABASE [ExampleDatabaseName] ^
FROM  DISK = N'D:\%NewestFile%' ^
WITH  FILE = 1,  ^
MOVE N'Example_CS' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example.mdf',  ^
MOVE N'Example_CS_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example_1.LDF',  ^
NOUNLOAD,  STATS = 10"

للسماح لهذا بالعمل مع أسماء الملفات باستخدام المسافات، هناك حاجة إلى نسخة معدلة من الإجابة المقبولة:

FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <<NewDir>> & GOTO :END
:END

@ كريس نوي

لاحظ أن المسافة الموجودة أمام & تصبح جزءًا من الأمر السابق.لقد أذهلني ذلك باستخدام SET، الذي يضع الفراغات الزائدة في القيمة بكل سرور.

للتغلب على المسافة الزائدة التي تتم إضافتها إلى متغير البيئة، قم بلف الأمر set بين قوسين.

على سبيل المثال FOR /F %%I IN ('DIR "*.*" /B /O:D') DO (SET NewestFile=%%I)

أعلم أنك طلبت نظام التشغيل Windows ولكنني اعتقدت أنني سأضيف هذا على أي حال، في Unix/Linux يمكنك القيام بما يلي:

cp `ls -t1 | head -1` /somedir/

والتي سوف تسرد جميع الملفات الموجودة في الدليل الحالي مرتبة حسب وقت التعديل ثم cp الأحدث إلى /somedir/

سيؤدي هذا إلى فتح نافذة cmd.exe ثانية.إذا كنت تريد أن تختفي، فاستبدل /K بـ /C.

من الواضح، استبدل new_file_loc بأي موقع ملف جديد.

@echo off
for /F %%i in ('dir /B /O:-D *.txt') do (
    call :open "%%i"
    exit /B 0
)
:open
    start "window title" "cmd /K copy %~1 new_file_loc"
exit /B 0
@echo off
set source="C:\test case"
set target="C:\Users\Alexander\Desktop\random folder"

FOR /F "delims=" %%I IN ('DIR %source%\*.* /A:-D /O:-D /B') DO COPY %source%\"%%I" %target% & echo %%I & GOTO :END
:END
TIMEOUT 4

محاولتي لنسخ أحدث ملف من مجلد

فقط قم بتعيين المجلدات المصدر والهدف الخاصة بك ويجب أن تعمل

هذا يتجاهل المجلدات، ويهتم فقط بالملفات

يوصى باختيار نوع الملف في مسار DIR المتغير *.* ل *.zip على سبيل المثال

أعتقد أن TIMEOUT لن يعمل على نظام التشغيل WinXP

سحق:

 find -type f -printf "%T@ %p \n" \
     | sort  \
     | tail -n 1  \
     | sed -r "s/^\S+\s//;s/\s*$//" \
     | xargs -iSTR cp STR newestfile

حيث سيصبح "newestfile" هو الملف الأحدث

وبدلاً من ذلك، يمكنك تنفيذ newdir/STR أو newdir فقط

انفصال:

  1. قم بإدراج جميع الملفات بتنسيق {time} {file}.
  2. فرزها حسب الوقت
  3. الحصول على آخر واحد
  4. اقطع الوقت والمسافات البيضاء من البداية/النهاية
  5. نسخ القيمة الناتجة

مهم

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

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