13

ファイルがリンクであるかどうかをバッチファイルでテストする方法であることを今学びました:

dir %filename% |  find "<SYMLINK>" && (
   do stuff
)

ディレクトリがシンボリックリンクであるかどうかをテストするために、同様のトリックを行うにはどうすればよいですか。ディレクトリ自体ではなく、ディレクトリの内容をリストする<SYMLINK>ため<SYMLINKD>、に置き換えるだけでは機能しません。dir %directoryname%

親ディレクトリで尋ねた場合と同じように、dirにディレクトリについて教えてもらう方法が必要なようです。( ls -dUNIX の場合と同様)。

または、ディレクトリがシンボリックリンクであるかどうかをテストする他の方法はありますか?

ありがとう!

4

8 に答える 8

19

あなたには3つの方法があります

解決策 1: fsutil リパースポイント

次のように、 symlink/junction を使用して成功fsutil reparsepoint queryを確認します。%errorlevel%

set tmpfile=%TEMP%\%RANDOM%.tmp

fsutil reparsepoint query "%DIR%" >"%tmpfile%"
if %errorlevel% == 0 echo This is a symlink/junction
if %errorlevel% == 1 echo This is a directory

fsutil reparsepoint query標準ディレクトリでは何もできず、エラーがスローされるため、これは機能します。しかし、許可エラーも原因%errorlevel%=1です!

解決策 2: dir + 検索

次のように、親ディレクトリのリンクを一覧表示しdir、出力をフィルターして、成功findを確認します。%errorlevel%

set tmpfile=%TEMP%\%RANDOM%.tmp

dir /AL /B "%PARENT_DIR%" | find "%NAME%" >"%tmpfile%"
if %errorlevel% == 0 echo This is a symlink/junction
if %errorlevel% == 1 echo This is a directory

解決策 3: for (最高)

これはリンクを示しているため、ディレクトリの属性を取得しfor、最後を確認します。これはよりスマートで最良のソリューションだと思います。

for %i in ("%DIR%") do set attribs=%~ai
if "%attribs:~-1%" == "l" echo This is a symlink/junction

参考までに、このソリューションは に依存していない%errorlevel%ため、「有効なエラー」も確認できます。

ソース

于 2014-03-09T14:05:48.587 に答える
11

一般的なコード:

fsutil reparsepoint query "folder name" | find "Symbolic Link" >nul && echo symbolic link found || echo No symbolic link

現在のフォルダーがシンボリックリンクであるかどうかを確認します。

fsutil reparsepoint query "." | find "Symbolic Link" >nul && echo symbolic link found || echo No symbolic link

親フォルダーがシンボリックリンクであるかどうかを確認します。

fsutil reparsepoint query ".." | find "Symbolic Link" >nul && echo symbolic link found || echo No symbolic link
于 2013-09-19T00:57:27.860 に答える
4

実際、ファイル名にアスタリスクを追加すると、DIR は正常に機能します。

dir %filename%* |  find "<SYMLINKD>" && (
   do stuff
)

GreenAsJade は、ディレクトリに %filename%* に一致する別のエントリがある場合、このソリューションの失敗に注意を喚起しました。私は、次のことがすべての場合にうまくいくと信じています:

set MYPATH=D:\testdir1
set FILENAME=mylink
set FULL=%MYPATH%\%FILENAME%
set SP1=0
for /f "tokens=4,5 delims= " %%A IN ('dir /L /N %FULL%*') do (
    if %%B EQU %FILENAME% (
    if "%%A" EQU "<SYMLINKD>" set SP1=1
    )
)
if %sp1% EQU 0 echo It's not there.
if %sp1% EQU 1 echo BINGO!
Pause
于 2014-10-29T22:38:37.697 に答える
3

これも機能します:

dir /al|find /i "java"|find /i "junction" && (エコー ディレクトリはシンボリック リンクです)

于 2014-12-02T21:28:36.347 に答える
3

更新:これで問題は解決しましたが、コメント者が指摘したように、dirディレクトリのシンボリックリンクとディレクトリジャンクションの両方が表示されます。したがって、ジャンクションが存在する場合、それは間違った答えです。


シンプルdir /A:ldにうまくいく

dir /?:

DIR [drive:][path][filename] [/A[[:]attributes]] …

/A          Displays files with specified attributes.  
attributes   D  Directories                R  Read-only files  
             H  Hidden files               A  Files ready for archiving  
             S  System files               I  Not content indexed files  
             L  Reparse Points             -  Prefix meaning not  

非リンク フォルダーに対してのみコマンドを実行するには、属性否定形式を使用できることに注意してください。

for /F "usebackq" %%D in (`dir /A:D-L /B some-folder`) do (
    some-command some-folder\%%D
)
于 2016-11-16T16:32:25.480 に答える
1

別の方法として、次のバッチ ファイル(reparse2.bat) で3 種類の再解析ポイントを個別に処理する方法があります。このバッチ ファイルは、関心のある種類のリンクのみを検索するように簡単に変更できます。

  ::  Directory to Search
  SET directory=C:\Users\%username%\Desktop\TEST1

  ::  Results Text
  echo SEARCH OF DIRECTORY: %directory% & echo.

  ::  Find FILE SymLinks in directory
  dir "%directory%" | find "<SYMLINK>" && (
    echo This is a SymLink FILE
  ) && ( echo. )

  ::  Find DIRECTORY SymLinks in directory
  dir "%directory%" | find "<SYMLINKD>" && (
    echo This is a SymLink DIRECTORY
  ) && ( echo. )

  ::  Find JUNCTIONS in directory
  dir "%directory%" | find "<JUNCTION>" && (
    echo This is a Directory JUNCTION
  ) && ( echo. ) && ( echo. )
于 2017-01-20T20:25:55.007 に答える