ファイルがPowerShellのシンボリックリンクかどうかを調べる
-
03-07-2019 - |
質問
ディレクトリツリーをたどっている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