質問

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

そうでない場合、シンボリックリンク(シンボリックリンク)の方が簡単ですか?

役に立ちましたか?

解決

これを試してください:

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

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

他のヒント

Powershell 5以降を使用している場合、次のワンライナーは、 d:\ Temp \ から始まるすべてのファイルハードリンク、ディレクトリジャンクション、シンボリックリンク、およびそれらのターゲットを再帰的にリストします。

dir 'd:\Temp' -recurse -force | ?{

Powershell 5以降を使用している場合、次のワンライナーは、 d:\ Temp \ から始まるすべてのファイルハードリンク、ディレクトリジャンクション、シンボリックリンク、およびそれらのターゲットを再帰的にリストします。

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 | ?{

Powershell 5以降を使用している場合、次のワンライナーは、 d:\ Temp \ から始まるすべてのファイルハードリンク、ディレクトリジャンクション、シンボリックリンク、およびそれらのターゲットを再帰的にリストします。

dir 'd:\Temp' -recurse -force | ?{

Powershell 5以降を使用している場合、次のワンライナーは、 d:\ Temp \ から始まるすべてのファイルハードリンク、ディレクトリジャンクション、シンボリックリンク、およびそれらのターゲットを再帰的にリストします。

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}

出力:

<*>

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

<*>

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

.LinkType} | select FullName,LinkType,Target

出力:

<*>

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

<*>

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

.LinkType} | select FullName,LinkType,@{ Name = "Targets"; Expression={

Powershell 5以降を使用している場合、次のワンライナーは、 d:\ Temp \ から始まるすべてのファイルハードリンク、ディレクトリジャンクション、シンボリックリンク、およびそれらのターゲットを再帰的にリストします。

dir 'd:\Temp' -recurse -force | ?{

Powershell 5以降を使用している場合、次のワンライナーは、 d:\ Temp \ から始まるすべてのファイルハードリンク、ディレクトリジャンクション、シンボリックリンク、およびそれらのターゲットを再帰的にリストします。

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}

出力:

<*>

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

<*>

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

.LinkType} | select FullName,LinkType,Target

出力:

<*>

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

<*>

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

.Target -join "`t"} }

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

<*>

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

.LinkType} | select FullName,LinkType,Target

出力:

<*>

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

<*>

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

Where-Object を使用して、ReparsePointファイル属性を検索します。

Get-ChildItem | Where-Object { 

Where-Object を使用して、ReparsePointファイル属性を検索します。

<*>.Attributes -match "ReparsePoint" }

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

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

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

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

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

もちろん、コマンドの c:\ windows \ system を変更することにより、検索を開始するディレクトリを変更できます。また、スクリプトは結果をファイル c:\ hardlinks.txt に書き込むだけです。名前を変更するか、&gt;からすべてを削除できます。文字をオンにすると、画面に出力されます。

Get-ChildItem -path C:\Windows\system -file -recurse -force | 
    foreach-object {
        if ((fsutil hardlink list 

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

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

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

もちろん、コマンドの c:\ windows \ system を変更することにより、検索を開始するディレクトリを変更できます。また、スクリプトは結果をファイル c:\ hardlinks.txt に書き込むだけです。名前を変更するか、&gt;からすべてを削除できます。文字をオンにすると、画面に出力されます。

<*>.fullname).count -ge 2) {

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

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

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

もちろん、コマンドの c:\ windows \ system を変更することにより、検索を開始するディレクトリを変更できます。また、スクリプトは結果をファイル c:\ hardlinks.txt に書き込むだけです。名前を変更するか、&gt;からすべてを削除できます。文字をオンにすると、画面に出力されます。

<*>.PSChildname + ":Hardlinked:" +

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

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

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

もちろん、コマンドの c:\ windows \ system を変更することにより、検索を開始するディレクトリを変更できます。また、スクリプトは結果をファイル c:\ hardlinks.txt に書き込むだけです。名前を変更するか、&gt;からすべてを削除できます。文字をオンにすると、画面に出力されます。

<*>.Length } else {

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

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

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

もちろん、コマンドの c:\ windows \ system を変更することにより、検索を開始するディレクトリを変更できます。また、スクリプトは結果をファイル c:\ hardlinks.txt に書き込むだけです。名前を変更するか、&gt;からすべてを削除できます。文字をオンにすると、画面に出力されます。

<*>.PSChildname + ":RegularFile:" +

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

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

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

もちろん、コマンドの c:\ windows \ system を変更することにより、検索を開始するディレクトリを変更できます。また、スクリプトは結果をファイル c:\ hardlinks.txt に書き込むだけです。名前を変更するか、&gt;からすべてを削除できます。文字をオンにすると、画面に出力されます。

<*>.Length } } > c:\hardlinks.txt
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top