اختبار في رمز PowerShell إذا كان المجلد نقطة تقاطع؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

كيف يمكنني الاختبار في رمز PowerShell إذا كان المجلد نقطة تقاطع؟

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

المحلول

ألق نظرة على هذه المدونة:http://blogs.msdn.com/powershell/archive/2010/02/10/viewing-junctions-with-dir.aspx

الطريقة للقيام بذلك هي نسخ ملف تنسيق نظام الملفات المضمّن ، وتعديله بحيث يتم الإشارة إلى الوصلات ، ثم تحميله مع تحديث formatdata:

من المدونة:

قواعد تنسيق نظام الملفات في $pshome\FileSystem.Format.ps1xml. لقد نسخت هذا ، ثم في العنصر [ViewDefinitions –> View –> TableControl –> TableRowEntries –> TableRowEntry –> TableColumnItems –> TableColumnItem]لقد غيرت محتوى اسم الخاصية مع قيمة "الوضع" إلى ما يلي:

<ScriptBlock> 
   "$($_.Mode)$(if($_.Attributes -band [IO.FileAttributes]::ReparsePoint)
{'J'})" </ScriptBlock> 

هذا يفعل قليلا وعلى خاصية كائن الدليل ($_.Attributes) ضد .NET System.IO.FileAttributes.ReparsePointقيمة التعداد. إذا لم تكن النتيجة صفرًا ، فإنها تعرض "J" بجوار سمات وضع الملف الأخرى. بعد ذلك ، قم بتحميل ملف التنسيق الجديد مثل هذا:

 PS> Update-FormatData -PrependPath myFilesystem.format.ps1xml

ال prependpath يضمن المعلمة تحميل ملف التنسيق الجديد قبل ملفات التنسيق المدمجة.

DIRECTORY Alink لديه "J" في عمود الوضع ، يبدو أنه يعمل!

إنه في عمود الوضع J لتقاطع.

نصائح أخرى

إذا (الحصول على عنصر مجلد الاختبار) .attributes.toString ().شفرة}

منذ ما لا يقل عن PowerShell V5.0 ، هناك دعم أفضل للروابط (أو كما يدعو MS: نقاط حام))

محسّن العنصر cmdlets - LinkType منشأه

المقالة المرتبطة تحت فئة WMF 5.0 ، مما قد يعني أن الطريقة كانت متاحة منذ PS V5.0.
تم تضمين هذه الميزات في Get-Intem القياسية ، Get-Childitem ، لذلك لا توجد خطوات إضافية مطلوبة. يمكن استخدامه على أي PS الحالي.

LinkType هي خاصية سلسلة على كائن ، يتم إرجاع
يمكن أن يكون لها واحدة من القيم الأربع التالية: "" الوصل "،" SymbolicLink "،" Hardlink ".

للإجابة على سؤال OP ، يمكنك التحقق مما إذا كان المجلد نقطة تقاطع باستخدام:

if ((Get-Item -Path $Target -Force).LinkType -eq "Junction") { }

للتحقق مما إذا كان الملف/المجلد هو "نقطة حزمة" ، من أي نوع (تقاطع ، رمز أو رابط صادق):

if ((Get-Item -Path $Target -Force).LinkType) { }

قيمة LinkType على الملف/المجلد العادي هي سلسلة فارغة ، والتي عند استخدامها كـ إذا الشرط في PS يحل إلى خطأ


يمكن استخدام Get-Childitem لسرد جميع مجلدات الوصلات:

(Get-ChildItem -Path $Target -Force) | Where-Object { $_.LinkType -eq "Junction" }

لاحظ أن القيمة "SymboricLink" هي نفسها لكل من الملف أو المجلد ، لذا لسرد الروابط الرمزية فقط للمجلدات:

(Get-ChildItem -Path $Target -Directory -Force) | Where-Object { $_.LinkType -eq "SymbolicLink" }


Cmdlet Get-Childitem (الاسم المستعار: DIR ، LS ، GCI) يظهر الآن سمة المحامير ، مثل l في عمود الوضع ، دون أي امتداد. لكنه لن يظهر "الصلابة" والعروض l لكل من الوصلات والرمز:

> Get-ChildItem -Path $Target -Force


    Directory: C:\Users


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d--hsl       2018-04-12     01:45                All Users                     
d-rh--       2018-05-09     06:12                Default                       
d--hsl       2018-04-12     01:45                Default User                  
d-----       2018-06-24     03:05                Papo                          
d-r---       2018-07-27     07:12                Public
  • لا يعمل LinkType على المجلدات ذات الأذونات الخاصة داخل user و user ، على الرغم من أن Get-Childitem كما هو موضح أعلاه يعمل ويظهر l عليهم.
  • إزالة العنصر لديه مشاكل. لا يمكن إزالة التقاطع ، وإذا أجبرت ، فإنه سيزيل المحتويات الأصلية معها. يقال إن هذا ثابت في الإصدار المستقبلي PS V6

إن استخدام هذه CMDlets المحسّنة ، أو CMDlets القياسية اليوم ، لها بعض المزايا على الطرق السابقة ، الموضحة في الإجابات القديمة هنا.

  • إنه يميز بين الوصل والرابط الرمزي
    إذا أراد OP اختبار ما إذا كان المجلد هو تقاطع ، فإن التحقق من خاصية السمة سيؤدي إلى إيجابية خاطئة للرابط الرمزي للمجلد.

  • يكتشف الرابط الصعب.

  • LinkType هو [سلسلة] بدلاً من خاصية السمات ، وهي نوع [fileattributes] والاحتياجات .ToString () أو استخدام النطاق

لمعلوماتك ، إذا كنت تعمل باورشيل امتدادات المجتمع, ، هذه المعلومات متوفرة كإخراج (وكخاصية ملاحظة) عند إخراج Get-Childitem:

21> gci .\Roaming\Microsoft\eHome


    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Users...


Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d----     2/15/2010 12:18 AM        <DIR> DvdCoverCache
d----      8/9/2009  1:10 AM    <SYMLINK> DvdInfoCache [\...
d----      8/8/2009 11:51 PM        <DIR> DvdInfoCache.orig
d----    10/22/2009  7:12 PM        <DIR> mcl_images

ومع ذلك ، للوصول إلى البرنامج ، سأصل إلى المعلومات عبر خاصية السمات كما يوحي الملصق الآخر.

إذا كان لديك ملحقات مجتمع PowerShell التي أوصي بها إذا كنت تعمل مع تقاطعات ، فيمكنك القيام بما يلي لتحديد ما إذا كان المجلد هو تقاطع أم لا:

Import-Module pscx
if ((Get-Item *test_folder*).ReparsePoint){
    Write-Host "YES"
}

جرب هذا:

$TargetAttributes = (Get-Item -Path $Target -Force).Attributes.ToString()
if ($TargetAttributes -match "ReparsePoint") {
    if ($TargetAttributes -match "Archive") {
        Write-Output ("Link to a file.")
    } else {
        Write-Output ("Link to a folder.")
    }
} else {
    Write-Output ("Normal File or Folder.")
}    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top