Powershell - اكتشف ما إذا كان هناك ملفان يحملان نفس الاسم

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

سؤال

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

لدليل الاختبار التالي:

  • |-- ج:\اختبار\
    • |--C: est\YY\
      • |--C: est\YY\xx.log
      • |--C: est\YY\xx.txt
    • |-- C: est\ZZ\
    • |-- C: est\ZZ.log
    • |-- C: est\ZZ.txt

أحتاج إلى الكود الخاص بي للعثور على xx.log وZZ.log.يمكنني تضمين شيك ضد $_.PSisContainer (لكنني لم أعتقد أنه كان ضروريا).

ForEach ($item in (gci "C:\Test\*" -recurse)) {
    If ($item.extension -notmatch "txt" -AND $item.basename+".txt" -eq $True) {
        Write-Host $item.fullname
        } 
    }

$item.basename+".txt" يوفر السلسلة الصحيحة ولكن لا يمكنني استخدام هذه السلسلة للتحقق من وجود الملف.

هل يمكن لأي شخص المساعدة في تصحيح الكود الخاص بي؟أود أن أتعلم كيفية التعامل مع السلاسل المتسلسلة مثل هذه - إنها خدعة أعتقد أنها ستكون مفيدة في مجالات أخرى.

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

المحلول

ليس المقصود من هذا أن يكون إجابة، بل تعليقًا، لكن SO لا يسمح لي بإضافة تعليقات الآن :(

R_C_III - أعتقد أن هناك خطأين في الكود الأصلي.

أولاً، لا يقوم بإنشاء مسار الملف الكامل (أي.اسم الدليل + الاسم الأساسي + .TXT).بدلاً من تسلسل السلاسل للقيام بذلك، استخدم Keith قدرة PowerShell على إجراء عمليات استبدال القيمة داخل السلاسل ذات علامات الاقتباس المزدوجة.على سبيل المثال

$s = "there"
write-host "hello $s"

النتائج في

hello there

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

$file = get-item "c:\somefile.txt"
write-host "$($file.DirectoryName)\$($file.BaseName).NEW"

النتائج في

c:\somefile.NEW

ثانيًا (حسب تعليقي على إجابة كيث)، لا يتحقق الكود الأصلي من وجود إصدار ".txt" من الملف.تحاول الجملة الثانية في عبارة IF مساواة اسم الملف المعدل بـ $True ($item.basename+".txt" -eq $True).سيتم تقييم هذه الجملة دائمًا على أنها خاطئة.

يضيف تعديل Keith أمر CmdLet 'Test-Path' الذي، في هذه الحالة، يتحقق من وجود الملف '.txt'.

نصائح أخرى

جرب هذا:

gci C:\Test -recurse -file | Where {$_.extension -ne ".txt" -AND (Test-Path "$($_.DirectoryName)\$($_.BaseName).txt")}

لا تحتاج إلى الأولي Foreach عبارة كأوامر PowerShell يمكن استخدام بيانات الإخراج مباشرة في بداية خط الأنابيب.ثم تقوم بتصفية كائنات خطوط الأنابيب باستخدام ملف Where يأمر.

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