معرفة ما إذا كان ملف ارتباط رمزي في بوويرشيل

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

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا على وجود سيناريو بوويرشيل التي يسير شجرة دليل، وأحيانا لدي ملفات المساعدة hardlinked هناك والتي لا ينبغي أن تتم معالجتها. هل هناك طريقة سهلة لمعرفة ما إذا كان ملف (أي، System.IO.FileInfo) هو ارتباط ثابت أم لا؟

إذا لم يكن كذلك، سيكون من الأسهل مع وصلات رمزية (روابط الرمزية)؟

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

المحلول

وجرب هذا:

function Test-ReparsePoint([string]$path) {
  $file = Get-Item $path -Force -ea SilentlyContinue
  return [bool]($file.Attributes -band [IO.FileAttributes]::ReparsePoint)
}

ووهو تطبيق الحد الأدنى جدا، لكنه ينبغي أن تفعل خدعة. لاحظ أن هذا لا يميز بين ارتباط ثابت وارتباط رمزي. تحت، وكلاهما مجرد الاستفادة من NTFS إعادة التوزيع يشير و <لأ href = "HTTP: // en.wiktionary.org/wiki/IIRC "يختلط =" noreferrer "> IIRC .

نصائح أخرى

إذا كان لديك بوويرشيل 5+ على الخطوط الملاحية المنتظمة واحدة بعد يسرد بشكل متكرر كل hardlinks الملف، تقاطعات دليل وصلات رمزية وأهدافها بدءا من d:\Temp\:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target

وإخراج:

FullName                                LinkType     Target
--------                                --------     ------
D:\Temp\MyJunctionDir                   Junction     {D:\exp\junction_target_dir}
D:\Temp\MySymLinkDir                    SymbolicLink {D:\exp\symlink_target_dir}
D:\Temp\MyHardLinkFile.txt              HardLink     {D:\temp\MyHardLinkFile2.txt, D:\exp\hlink_target.xml}
D:\Temp\MyHardLinkFile2.txt             HardLink     {D:\temp\MyHardLinkFile.txt, D:\exp\hlink_target.xml}
D:\Temp\MySymLinkFile.txt               SymbolicLink {D:\exp\symlink_target.xml}
D:\Temp\MySymLinkDir\MySymLinkFile2.txt SymbolicLink {D:\temp\normal file.txt}

إذا كنت تهتم أهداف متعددة لhardlinks استخدام هذا الاختلاف الذي يسرد يستهدف مفصول:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,@{ Name = "Targets"; Expression={$_.Target -join "`t"} }

وقد تحتاج امتيازات المسؤول لتشغيل هذا البرنامج النصي على C:\ مثلا.

والاستفادة Where-Object للبحث عن سمة الملف ReparsePoint.

Get-ChildItem | Where-Object { $_.Attributes -match "ReparsePoint" }

ونتائجي ويندوز فيستا، وذلك باستخدام برنامج نصي بوويرشيل كيث هيل لاختبار روابط الرمزية وhardlinks:

c:\markus\other>mklink symlink.doc \temp\2006rsltns.doc
symbolic link created for symlink.doc <<===>> \temp\2006rsltns.doc

c:\markus\other>fsutil hardlink create HARDLINK.doc  \temp\2006rsltns.doc
Hardlink created for c:\markus\other\HARDLINK.doc <<===>> c:\temp\2006rsltns.doc

c:\markus\other>dir
 Volume in drive C has no label.
 Volume Serial Number is C8BC-2EBD

 Directory of c:\markus\other

02/12/2010  05:21 PM    <DIR>          .
02/12/2010  05:21 PM    <DIR>          ..
01/10/2006  06:12 PM            25,088 HARDLINK.doc
02/12/2010  05:21 PM    <SYMLINK>      symlink.doc [\temp\2006rsltns.doc]
               2 File(s)         25,088 bytes
               2 Dir(s)   6,805,803,008 bytes free

c:\markus\other>powershell \script\IsSymLink.ps1 HARDLINK.doc
False

c:\\markus\other>powershell \script\IsSymLink.ps1 symlink.doc
True

وهذا يظهر ان روابط الرمزية هي نقاط إعادة التوزيع، ولها ReparsePoint FileAttribute مجموعة بت، في حين hardlinks لا.

والسيناريو بوويرشيل التالية سوف سرد كافة الملفات في الدليل أو الأدلة مع التبديل -Recurse. وسوف تدرج اسم الملف، سواء كان ملف العادية أو ملف hardlinked، وحجم، مفصولة نقطتين.

ويجب تشغيله من سطر الأوامر بوويرشيل. لا يهم الدليل الذي تشغيلها من تلك التي تم تعيينها في البرنامج النصي.

ويستخدم الأداة المساعدة fslink شحنها مع ويندوز ويدير هذا ضد كل ملف باستخدام hardlink وقائمة المفاتيح وتعول خطوط الانتاج. إذا كان اثنان أو أكثر وهو ملف hardlinked.

ويمكنك تغيير بالطبع الدليل يبدأ البحث من خلال تغيير c:\windows\system في الأمر. أيضا، والسيناريو ببساطة يكتب النتائج إلى ملف، c:\hardlinks.txt. يمكنك تغيير الاسم أو ببساطة حذف كل شيء من> الحرف على، وسوف الإخراج إلى الشاشة.

Get-ChildItem -path C:\Windows\system -file -recurse -force | 
    foreach-object {
        if ((fsutil hardlink list $_.fullname).count -ge 2) {
            $_.PSChildname + ":Hardlinked:" + $_.Length
        } else {
            $_.PSChildname + ":RegularFile:" + $_.Length
        }
    } > c:\hardlinks.txt
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top