سؤال

يعمل البرنامج النصي العامل الذي ينقل ملفات مختلفة بناء على اسم الملف بنجاح.بعد الانتهاء من البرنامج النصي ، سيتحقق من دليلين بحثا عن أي ملفات باقية باستخدام IF EXIST *.txt.هذا يعمل بشكل رائع إلا أنني لاحظت بعض الملفات بدون امتداد.لم تكن هذه مشكلة من قبل وبما أنه لا يمكن مساعدتها بسبب عمليات خارجة عن إرادتي ، فأنا بحاجة إلى تعديل البرنامج النصي الخاص بي.

فكرتي الوحيدة هي الكود التالي.تحمل مع كما أن هناك شرطين:

:check1
PUSHD "\\UNC\path1" &&(
DIR /A-D *.
IF %errorlevel% NEQ 0 GOTO check2
) & POPD

:add1
ECHO Add note to the log file

:check2
PUSHD "\\UNC\path2" &&(
DIR /A-D *.
IF %errorlevel% NEQ 0 GOTO laststep
) & POPD

:add2
ECHO Add note to the log file

:laststep
Some other code before exiting

يجب تشغيل هذا DIR على المسار وإذا كانت الملفات بدون ملحقات موجودة ، فسيكون لها %errorlevel% صفر والانتقال إلى الاختيار التالي.إذا كان هناك لا الملفات الحالية ، سيكون لها %errorlevel% ليس صفرا (على الأرجح 1) وسيلحق بعض النص بالسجل قبل الفحص التالي.تحقق اثنين سوف تفعل الشيء نفسه.

يبدو أن هذا معقد للغاية ولا يمكنني العثور على حل "أحادي الخط" سهل مثل IF EXIST.أدرك أنه يمكنني استخدام *. ولكن هذا يعود الدلائل كذلك ، وقد يؤدي إلى غير صحيحة %errorlevel%.

رمز محدث

حيث أقوم عادة بتعيين المتغيرات الخاصة بي ، أنا أيضا SET المسارين لتشغيل DIR ضد.بهذه الطريقة يمكن استخدامها بسهولة أكبر في مكان آخر و أنا تجاوز خطأ مسار ونك أحصل عادة-أسباب ذلك غير معروفة بالنسبة لي.التحقق من الملف المحدث ، المستخدم فقط للملفات بدون امتداد ، هو:

DIR %p1% /b /a-d|FIND /v "." && ECHO Found 1 >> %log%
DIR %p2% /b /a-d|FIND /v "." && ECHO Found 2 >> %log%
FINDSTR /I "Found" %log%
IF %errorlevel% EQU 0 GOTO stillthere

:nofiles
Some code
GOTO domore

:stillthere
Some code

:domore
Other code before exit

شكرا لك على الردود ، لقد تعلمت من هذا.

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

المحلول

هل هذا ما تريد أن تجد?

dir /b /a-d |find /v "."

نصائح أخرى

@ECHO OFF
SETLOCAL
:check1
PUSHD "u:\path1"
DIR /A-D *. >NUL 2>NUL
IF %errorlevel% EQU 0 ECHO Add note \path1 to the log file
POPD

PUSHD "u:\path2"
DIR /A-D *. >NUL 2>NUL
IF %errorlevel% EQU 0 ECHO Add note \path2 to the log file
POPD

:laststep
:: Some other code before exiting

GOTO :EOF

وتشمل المشاكل الخاصة بك:

ضمن بيان كتلة (a parenthesised series of statements), ، ال كامل يتم تحليل الكتلة و ثم أعدم.أي %var% داخل الكتلة سيتم استبدالها بقيمة هذا المتغير في الوقت الذي يتم فيه تحليل الكتلة - قبل تنفيذ الكتلة-نفس الشيء ينطبق على FOR ... DO (block).

ومن هنا, IF (something) else (somethingelse) سيتم تنفيذها باستخدام قيم %variables% في ذلك الوقت IF واجه.

وكنت يحتمل القفز من PUSHD/POPD قوس مما يعني الخاص بك POPD لن يستعيد بالضرورة دليل البداية.

(لاحظ أنني استخدمت u:\ بدلا من خادم لتناسب نظام بلدي)

أنت تستخدم بالفعل && للتحقق PUSHD عملت.يمكنك أن تفعل الشيء نفسه مع الخاص بك DIR /-D.أجد أنه يجعل الحياة أسهل.أيضا ، ربما تريد إخفاء أي رسالة خطأ إذا *. لم يتم العثور عليه ، خاصة وأن هذا هو الشرط المتوقع.لقد أخفيت أيضا عرض أي ملفات يمكن العثور عليها ، ولكن يمكنك بالتأكيد التخلص من إعادة التوجيه هذه.قد ترغب أيضا في إخفاء رسالة الخطأ إذا فشل بوشد ، ولكن لم أكن تنفيذ ذلك.

PUSHD "\\UNC\path1" && (
  DIR /A-D *. 1>nul 2>nul && ECHO Add note to the log file
  POPD
)

PUSHD "\\UNC\path2" && (
  DIR /A-D *. 1>nul 2>nul && ECHO Add note to the log file
  POPD
)

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