Powershell - اكتشف ما إذا كان هناك ملفان يحملان نفس الاسم
-
21-12-2019 - |
سؤال
أحاول التحقق من سلسلة من الدلائل والأدلة الفرعية لمعرفة ما إذا كان هناك ملفان أو أكثر بنفس الاسم في نفس المجلد.أعتقد أن مشكلتي هي كيف أحاول التحقق من صحة السلسلة.
لدليل الاختبار التالي:
- |-- ج:\اختبار\
- |--C: est\YY\
- |--C: est\YY\xx.log
- |--C: est\YY\xx.txt
- |-- C: est\ZZ\
- |-- C: est\ZZ.log
- |-- C: est\ZZ.txt
- |--C: est\YY\
أحتاج إلى الكود الخاص بي للعثور على 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
يأمر.