40

ディレクトリツリーをウォークしているPowerShellスクリプトがあり、処理されるべきではない補助ファイルがそこにハードリンクされている場合があります。ファイル(つまり、System.IO.FileInfo)がハードリンクであるかどうかを確認する簡単な方法はありますか?

そうでない場合は、シンボリックリンク(symlinks)を使用する方が簡単でしょうか?

4

7 に答える 7

43

これを試して:

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

これは非常に最小限の実装ですが、うまくいくはずです。これは、ハードリンクとシンボリックリンクを区別しないことに注意してください。その下では、どちらもNTFS再解析ポイントIIRCを利用しています。

于 2009-05-03T21:32:14.357 に答える
33

Powershell 5以降を使用している場合、次のワンライナーは、すべてのファイルハードリンク、ディレクトリジャンクション、シンボリックリンク、およびそれらのターゲットを再帰的に一覧表示します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}

ハードリンクの複数のターゲットが気になる場合は、タブ区切りのターゲットを一覧表示するこのバリエーションを使用してください。

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

たとえば、このスクリプトを実行するには、管理者権限が必要な場合がありますC:\

于 2017-02-08T15:39:04.697 に答える
18

ReparsePointWhere-Objectファイル属性を検索するために利用します。

Get-ChildItem | Where-Object { $_.Attributes -match "ReparsePoint" }
于 2015-12-30T16:59:04.373 に答える
7

リソースがハードリンクまたはシンボリックリンクであるかどうかを確認したい場合:

(Get-Item ".\some_resource").LinkType -eq "HardLink"

(Get-Item ".\some_resource").LinkType -eq "SymbolicLink"
于 2019-09-13T17:59:31.183 に答える
3

キースヒルのPowerShellスクリプトを使用してシンボリックリンクとハードリンクをテストしたVistaでの私の結果:

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ビットが設定されているのに対し、ハードリンクは設定されていないことを示しています。

于 2010-02-12T22:26:40.413 に答える
2

次のPowerShellスクリプトは、-recurseスイッチを使用して1つまたは複数のディレクトリ内のすべてのファイルを一覧表示します。通常のファイルかハードリンクファイルかを問わず、ファイルの名前とサイズがコロンで区切られて一覧表示されます。

PowerShellコマンドラインから実行する必要があります。スクリプトで設定されているため、どのディレクトリから実行してもかまいません。

Windowsに付属のfslinkユーティリティを使用し、ハードリンクスイッチとリストスイッチを使用して各ファイルに対して実行し、出力行をカウントします。2つ以上の場合は、ハードリンクされたファイルです。

もちろん、コマンドのを変更することで、検索を開始するディレクトリを変更できます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
于 2015-06-13T01:47:36.940 に答える
1

これは、1つのファイルをチェックし、それがシンボリックリンクであるかどうかを返すワンライナーで$FilePathあり、ファイルとディレクトリで機能します

if((Get-ItemProperty $FilePath).LinkType){"symboliclink"}else{"normal path"}
于 2020-01-30T20:55:53.453 に答える