معرفة ما إذا كان ملف ارتباط رمزي في بوويرشيل
-
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