84

ファイルがディレクトリかどうかを調べる方法はありますか?

変数にファイル名があります。Perlでは、これを行うことができます:

if(-d $var) { print "it's a directory\n" }
4

23 に答える 23

64

最近、上記とは異なるアプローチで失敗しました。おそらく、ここの dfs に関連している可能性があります。ファイル属性を使用して最初の文字をカットする

@echo off
SETLOCAL ENABLEEXTENSIONS
set ATTR=%~a1
set DIRATTR=%ATTR:~0,1%
if /I "%DIRATTR%"=="d" echo %1 is a folder
:EOF
于 2010-09-16T16:35:55.063 に答える
60

次のように実行できます。

IF EXIST %VAR%\NUL ECHO It's a directory

ただし、これは名前にスペースが含まれていないディレクトリに対してのみ機能します。スペースを処理するために変数を引用符で囲むと、機能しなくなります。スペースを含むディレクトリを処理するには、次のようにファイル名を短い 8.3 形式に変換します。

FOR %%i IN (%VAR%) DO IF EXIST %%~si\NUL ECHO It's a directory

は8.3 ファイル名に%%~si変換されます。変数%%iを使用して実行できる他のすべてのトリックを表示するには、コマンド プロンプトで次のように入力します。FORHELP FOR

(注 - 上記の例は、バッチ ファイルで機能する形式です。コマンド ラインで機能させるには、両方の場所%%で をに置き換えます。)%

于 2008-09-26T12:01:33.553 に答える
12

以前の製品に加えて、これも機能することがわかりました。

if exist %1\ echo Directory

呼び出し元が提供するため、%1 を囲む引用符は必要ありません。これにより、1年前の私の回答よりもキーストローク全体が1回節約されます;-)

于 2010-10-02T12:57:13.320 に答える
11

これは、FORを使用して完全修飾パスを作成し、プッシュしてパスがディレクトリかどうかをテストするスクリプトです。スペースのあるパスとネットワークパスでどのように機能するかに注目してください。

@echo off
if [%1]==[] goto usage

for /f "delims=" %%i in ("%~1") do set MYPATH="%%~fi"
pushd %MYPATH% 2>nul
if errorlevel 1 goto notdir
goto isdir

:notdir
echo not a directory
goto exit

:isdir
popd
echo is a directory
goto exit

:usage
echo Usage:  %0 DIRECTORY_TO_TEST

:exit

上記を「isdir.bat」として保存した出力例:

C:\>isdir c:\Windows\system32
is a directory

C:\>isdir c:\Windows\system32\wow32.dll
not a directory

C:\>isdir c:\notadir
not a directory

C:\>isdir "C:\Documents and Settings"
is a directory

C:\>isdir \
is a directory

C:\>isdir \\ninja\SharedDocs\cpu-z
is a directory

C:\>isdir \\ninja\SharedDocs\cpu-z\cpuz.ini
not a directory
于 2008-09-27T16:22:44.477 に答える
6

これは完全に機能します

if exist "%~1\" echo Directory

%~1 を使用して %1 から引用符を削除し、最後にバックスラッシュを追加する必要があります。次に、thw 全体を再び qutes に入れます。

于 2011-09-27T10:08:15.753 に答える
3

NUL手法は、8.3準拠のファイル名でのみ機能するようです。

(つまり、 `D:\ Documents and Settings`は「悪い」であり、` D:\ DOCUME〜1`は「良い」です)


「ドキュメントと設定」のように、ディレクトリ名にスペースが含まれている場合、「NUL」テクニックを使用するのは難しいと思います。

Windows XP Service Pack 2を使用していて、%SystemRoot%\ system32\cmd.exeからcmdプロンプトを起動しています。

これが機能しなかったものと私のために機能したもののいくつかの例です:

(これらはすべて、インタラクティブなプロンプトで「ライブ」で実行されるデモンストレーションです。スクリプトでデバッグする前に、そこで動作させる必要があると思います。)

これは機能しませんでした:

D:\Documents and Settings>if exist "D:\Documents and Settings\NUL" echo yes

これは機能しませんでした:

D:\Documents and Settings>if exist D:\Documents and Settings\NUL echo yes

これは(私にとっては)機能します:

D:\Documents and Settings>cd ..

D:\>REM get the short 8.3 name for the file

D:\>dir /x

Volume in drive D has no label. Volume Serial Number is 34BE-F9C9

Directory of D:\
09/25/2008 05:09 PM <DIR> 2008
09/25/2008 05:14 PM <DIR> 200809~1.25 2008.09.25
09/23/2008 03:44 PM <DIR> BOOST_~3 boost_repo_working_copy
09/02/2008 02:13 PM 486,128 CHROME~1.EXE ChromeSetup.exe
02/14/2008 12:32 PM <DIR> cygwin

[[ここを見てください!!!! ]]
09/25/2008 08:34 AM <DIR> DOCUME~1 Documents and Settings

09/11/2008 01:57 PM 0 EMPTY_~1.TXT empty_testcopy_file.txt
01/21/2008 06:58 PM <DIR> NATION~1 National Instruments Downloads
10/12/2007 11:25 AM <DIR> NVIDIA
05/13/2008 09:42 AM <DIR> Office10
09/19/2008 11:08 AM <DIR> PROGRA~1 Program Files
12/02/1999 02:54 PM 24,576 setx.exe
09/15/2008 11:19 AM <DIR> TEMP
02/14/2008 12:26 PM <DIR> tmp
01/21/2008 07:05 PM <DIR> VXIPNP
09/23/2008 12:15 PM <DIR> WINDOWS
02/21/2008 03:49 PM <DIR> wx28
02/29/2008 01:47 PM <DIR> WXWIDG~2 wxWidgets
3 File(s) 510,704 bytes
20 Dir(s) 238,250,901,504 bytes free

D:\>REM now use the \NUL test with the 8.3 name

D:\>if exist d:\docume~1\NUL echo yes

yes

これは機能しますが、ドットはすでに私がディレクトリにいることを意味しているので、それはちょっとばかげています:

D:\Documents and Settings>if exist .\NUL echo yes

于 2008-09-26T16:53:23.930 に答える
3

私はこれを使用します:

if not [%1] == [] (
  pushd %~dpn1 2> nul
  if errorlevel == 1 pushd %~dp1
)
于 2010-09-08T13:24:22.230 に答える
2

非常に簡単な方法は、子が存在するかどうかを確認することです。

子に子がない場合、existコマンドは false を返します。

IF EXIST %1\. (
  echo %1 is a folder
) else (
  echo %1 is a file
)

十分なアクセス権がない場合、偽陰性が発生する可能性があります (私はテストしていません)。

于 2012-07-26T09:41:05.770 に答える
2

あなたがcdそれに入ることができれば、それはディレクトリです:

set cwd=%cd%

cd /D "%1" 2> nul
@IF %errorlevel%==0 GOTO end

cd /D "%~dp1"
@echo This is a file.

@goto end2
:end
@echo This is a directory
:end2

@REM restore prior directory
@cd %cwd%
于 2015-10-25T12:17:49.733 に答える
1

これが私の解決策です:

REM make sure ERRORLEVEL is 0
TYPE NUL

REM try to PUSHD into the path (store current dir and switch to another one)
PUSHD "insert path here..." >NUL 2>&1

REM if ERRORLEVEL is still 0, it's most definitely a directory
IF %ERRORLEVEL% EQU 0 command...

REM if needed/wanted, go back to previous directory
POPD
于 2013-06-07T13:34:31.343 に答える
1

「ディレクトリの存在をバッチファイルでテストする方法」というタイトルのこの記事に基づくと、「完全に信頼できるわけではありません」。

しかし、私はこれをテストしました:

@echo off
IF EXIST %1\NUL goto print
ECHO not dir
pause
exit
:print
ECHO It's a directory
pause

そしてそれはうまくいくようです

于 2008-09-26T12:01:41.103 に答える
0

これは、BATCH ファイルで使用するコードです。

```
@echo off
set param=%~1
set tempfile=__temp__.txt
dir /b/ad > %tempfile%
set isfolder=false
for /f "delims=" %%i in (temp.txt) do if /i  "%%i"=="%param%" set isfolder=true
del %tempfile%
echo %isfolder%
if %isfolder%==true echo %param% is a directory

```

于 2012-07-12T20:39:58.450 に答える
0

これが、存在する場合、pushd、dir /ADなどを使用して多くのテストを行った後の私の解決策です...

@echo off
cd /d C:\
for /f "delims=" %%I in ('dir /a /ogn /b') do (
    call :isdir "%%I"
    if errorlevel 1 (echo F: %%~fI) else echo D: %%~fI
)
cmd/k

:isdir
echo.%~a1 | findstr /b "d" >nul
exit /b %errorlevel%

:: Errorlevel
:: 0 = folder
:: 1 = file or item not found
  • 拡張子のないファイルで動作します
  • folder.extという名前のフォルダーで動作します
  • UNCパスで動作します
  • 二重引用符で囲まれたフルパス、またはディレクトリ名またはファイル名のみで機能します。
  • 読み取り権限がなくても機能します
  • ディレクトリ リンク (ジャンクション) で動作します。
  • パスにディレクトリ リンクが含まれるファイルで機能します。
于 2014-11-24T02:44:09.507 に答える
0

メソッドを使用する際の問題の 1 つ%%~si\NULは、推測が間違っている可能性があることです。ファイル名を間違ったファイルに短縮する可能性があります。8.3ファイル名を解決するとは思わない%%~siが、推測するが、文字列操作を使用してファイルパスを短縮する. 同様のファイルパスがある場合、機能しない可能性があると思います。

別の方法:

dir /AD %F% 2>&1 | findstr /C:"Not Found">NUL:&&(goto IsFile)||(goto IsDir)

:IsFile
  echo %F% is a file
  goto done

:IsDir
  echo %F% is a directory
  goto done

:done

(goto IsFile)||(goto IsDir)他のバッチ コマンドに置き換えることができます。
(echo Is a File)||(echo is a Directory)

于 2010-09-07T22:12:45.277 に答える
0

Windows 7 および XP では、マップされたドライブ上のファイルとディレクトリを区別できません。次のスクリプト:

@エコーオフ
存在する場合 c:\temp\data.csv echo data.csv はファイルです
存在する場合 c:\temp\data.csv\ echo data.csv はディレクトリです
存在する場合 c:\temp\data.csv\nul echo data.csv はディレクトリです
存在する場合 k:\temp\nonexistent.txt echo nonexistent.txt はファイルです
存在する場合 k:\temp\something.txt echo something.txt はファイルです
存在する場合 k:\temp\something.txt\ echo something.txt はディレクトリです
存在する場合 k:\temp\something.txt\nul echo something.txt はディレクトリです

生成:

data.csv はファイルです
something.txt はファイルです
something.txt はディレクトリです
something.txt はディレクトリです

したがって、スクリプトにマップされたパスまたは UNC パスが供給される可能性がある場合は注意してください。以下の pushd ソリューションは、最も確実なようです。

于 2011-07-12T22:27:03.023 に答える