Windows 7では、ファイルがシンボリックリンクであるかどうか、フォルダーがジャンクションであるかどうかを確認する方法、およびファイルがシンボリックリンク/ジャンクションである場合に、それらが指している場所を確認する方法エクスプローラとコマンドラインの両方。
フォルダーツリーの正確なレプリカを作成する場合、別のコンピューターでシンボリックリンクを複製する方法を知るために、コマンドラインからそれを実行する方法を用意することは非常に重要です。
ファイルを右クリックして[プロパティ]をオンにすると、それがシンボリックリンクであることがわかりません。
dirコマンドdir /a
はこれを行うことができます:
2012-12-26 09:30 PM <DIR> .
2012-12-26 09:30 PM <DIR> ..
2012-12-26 09:30 PM 0 a.txt
2012-12-26 09:30 PM <SYMLINK> link.txt [a.txt]
または、Windowsエクスプローラを使用することもできます。
Right click column, More, Link Target
StackOverFlow からコピーしました。この行を使用しただけで機能します
fsutil reparsepoint query "folder name" | find "Symbolic Link" >nul && echo symbolic link found || echo No symbolic link
説明:
From [〜#〜] msdn [〜#〜] about FSUtil:再解析ポイントの管理、スパースファイルの管理など、ファイルアロケーションテーブル(FAT)およびNTFSファイルシステムに関連するタスクを実行します。ボリュームのマウントを解除します。パラメーターなしで使用すると、fsutilはサポートされているサブコマンドのリストを表示します。
ここでは、「シンボリックリンク」が含まれている行を出力するように注意します。シンボリックの場合はfind
になり、find
が成功した場合は1つ出力されます。そうでない場合は、別の出力を行います。
注記:
PowerShellを使用すると、少なくともWindows OSでは、次のような任意のディレクトリでシンボリックリンクを見つけることができます。
Get-ChildItem 'C:\nodejs\bin\' | Where-Object {$_.LinkType -eq 'SymbolicLink'}
より簡潔な代替手段は、Get-ChildItem
のエイリアスls
を使用することです。
ls 'C:\nodejs' -Attributes ReparsePoint -Recurse
また、次のいずれかを実行することにより、シンボリックリンクの関連情報を取得できます。
ファイルアイテムを取得し、そのTargetプロパティを出力します。ターゲットはシンボリックリンクの「値」です。さらに、オペレーティングシステム間で並置するときにシンボリックリンクを作成するためのメソッドまたはコマンドのシグネチャ、「ターゲット」、「パス」、「値」の引数名は、異なるOSの別のメソッドシグネチャとは異なる意味を持つ場合があります。
E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Target
E:\AIT\out\dependency_symlink.cmd
ファイル項目を取得し、そのLinkTypeプロパティを出力します。 Linkic値がSymbolicLinkのアイテムは、そのシンボルであることを意味します。
E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty LinkType
SymbolicLink
ファイル項目を取得し、そのModeプロパティを出力します。 Mode値にl
が含まれるアイテムは、それがシンボリックリンクであることを示します。
E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Mode
-a---l
ファイルアイテムを取得し、そのAttributesプロパティを出力します。シンボリックリンクを示すReparsePoint値の属性を持つアイテム。
E:\AIT> Get-Item -Path 'C:\nodejs\bin\ionic.cmd' | Select-Object -ExpandProperty Attributes
Archive, ReparsePoint
fsutil
を使用して、アイテムがシンボリックリンクかどうかを確認しないでください。最初はerrorlevelにエラーがあるため、場合によっては0のままで、実際のフォルダーはシンボリックリンクとして表示されます。エラーレベルは信頼できません。
find
の問題は、find "Symbolic Link"
は英語では可能ですが、他の言語ではできません。
良い方法は属性から検索することです:
for %%i in ("%file_to_test%") do set attribute=%%~ai
set attribute=%attribute:~8,1%
if "%attribute%" == "l" (
echo It's a symlink!
) else (
echo Damned! It's real!
)
%aで取得される属性は「drahscotlep」であり、「l」はシンボリックリンク用です。
これがシンボリックリンクを保存するcygwin bashスクリプトで、お気に入りのフォルダを最初の行に追加します
find c:/ C:/Users/$USERNAME/SendTo C:/Users/$USERNAME/Desktop \
-maxdepth 2 -type l \
-printf 'mklink\t/D\t"%p"\t"%l"\n' | \
Perl -pne '\
s!/cygdrive/(\w)/!\1:/!g;\
s,/a/,/%USERNAME%/,g;\
1;' | \
sort -f | uniq > restore-links.cmd
@ SecurityAndPrivacyGur へのすべてのクレジット、[cmd]
symlink {| s in folder}を読み取り、それらとそれらのターゲットパスを含むリストを出力する完全なバッチスクリプト/関数
@echo off
setlocal enableExtensions enableDelayedExpansion
cd /D "%~dp0"
set br=^
rem br;
set "pafIf=<<pafToSymlink|pafToFolder>>"
set "gIfZsymLink="
for /f "tokens=*" %%q in ('dir "!pafIf!" /al /b') do (
for /f "tokens=2 delims=[]" %%r in ('dir /al ^| findstr /i /c:"%%q"') do (
set "gIfZsymLink=!gIfZsymLink!%%~fq>%%r!br!"
)
)
set "gIfZsymLink=!gIfZsymLink:~0,-1!"
rem echo "!gIfZsymLink!"
for /f "tokens=1,2 delims=>" %%q in ("!gIfZsymLink!") do (
echo symlink: %%q , filepath: %%r
)
:scIn
rem endlocal
pause
rem exit /b
Powershellの場合:
dir | select Name, LinkType
本当にfsutilを使用したい場合は、両方のテクニックを使用して、エラーレベルによる障害を防ぐことができます。 (私はver> nulを使用してエラーレベルをリセットします)
:function_is_symlink_file_folder item_to_test result
rem 0 = Error
rem 1 = Symlink
rem 2 = File
rem 3 = Folder
:function_is_symlink_file_folder
setlocal enabledelayedexpansion
set item_to_test=!%~1!
set /a result=0
for %%i in ("%item_to_test%") do set attributes=%%~ai
set attribute_1=%attributes:~0,1%
set attribute_9=%attributes:~8,1%
ver >nul
fsutil reparsepoint query "%item_to_test%" >nul
if %errorlevel% == 1 (
if "%attribute_1%" == "d" (
set /a result=3
) else (
set /a result=2
)
) else (
if "%attribute_9%" == "l" (
set /a result=1
) else (
if "%attribute_1%" == "d" (
set /a result=3
) else (
set /a result=2
)
)
)
endlocal & set /a %~2=%result%
goto :eof