2016-07-03 22 views

答えて

0

は自明のコードです。 確認するパスを含む引数が必要です。

set "INPUT_PATH=%~1" 
set "FULL_PATH=%~f1" 
set "SHORT_PATH=%~s1" 
if /i "%INPUT_PATH%"=="%FULL_PATH%" echo this is a full path 
if exist "%INPUT_PATH%" echo this is an existing path 
if exist %SHORT_PATH%\NUL echo this is a directory 
+1

ハズレを取得し、それをすべて一緒置きます。あなたの絶対パステストは、 '..'、' .'、 '' '、またはUNCパスの存在下で失敗することがあります。'%short_path%\ nul'テストは興味深いですが、ボリュームに対して短い8.3パス。[私の答え]を参照してください(http://stackoverflow.com/a/38170999/1012053) – dbenham

5

これはほとんどの人が気付くよりもはるかにトリッキーです。 SOやその他の場所で利用できるこのトピックに関する多くの誤解があります。多くの "ソリューション"が動作するように見えますが、特定の状況では失敗します。

問題は2つの部分に分けることができます:あなたは、単に「%%〜FF」またはパラメータ "変数FOR使用して完全なパスにパスを変換することはできません

1)絶対的または相対的

%〜f1 "を読み込み、絶対パスを書き込むことができる無限の方法があるので、元の文字列と一致するかどうかテストします(大文字と小文字を区別しません)。有効な絶対パスには、\..\または\.\の任意の数を含めることができます。また、絶対パスにはドライブ文字を使用するか、UNCパスでもかまいません。また、絶対パスには、その中に任意の数の"を含めることができます。 、コロン、

  • ドライブ文字:

    私はパスが最初にすべての引用符を除去することによって、絶対的または相対的であるかどうかをテストし、その後、私はそれが次のいずれかで始まる場合FINDSTRをテストするために使用しますバックスラッシュに続く

  • 2つのバックは

2)は、ファイルやフォルダスラッシュまたは未存在

IF EXISTS pathを使用して、パスが有効かどうかを簡単に判断できます。しかし、ファイルをフォルダと区別することはより困難です。

DOSの時代に戻って、path\NULが存在するかどうかを確認し、そうであれば、そのパスがフォルダであることを知っていました。残念ながら、多くの人々は、これはWindowsで動作するという誤った印象の下にある - もう一つの頻繁な試みはpath\が存在するかどうかをテストすることであり、もしそうなら、それはフォルダでなければならないことを前提としてい

Windowsでそれが信頼できません。私はで使用するためにそれを採用している以外、 https://stackoverflow.com/a/8669636/1012053用とほぼ同じであるこれは、多くの場合、動作しているようですが、パスがディレクトリのシンボリックリンクやジャンクション

私が使用する分類コードを含む場合には、は動作しません。バッチパラメータではなく環境変数です。

私は、ファイル/フォルダの属性を調べるのにFOR変数~a修飾子を使用します。もし私がdを見つけると、それはフォルダです。 dのない属性が見つかった場合はファイルです。それ以外の場合、属性が見つからない場合は存在しません。

フォルダが存在するかどうかを正確に示す他の方法は、path\*が存在するかどうかをテストすることですが、この方法ではあまり経験がありません。


だから私は

@echo off 
setlocal 
set var=test.bat 

setlocal enableDelayedExpansion 

:: Determine absolute or relative 
echo(!var:^"=!|findstr /i "^[A-Z]:[\\] ^[\\][\\]" >nul && set "type=absolute" || set "type=relative" 

:: Determine file or folder or not exists 
for /f eol^=^ delims^= %%F in ("!var!") do (
    for /f "tokens=1,2 delims=d" %%A in ("-%%~aF") do if "%%B" neq "" (
    echo %%F = %type% folder 
) else if "%%A" neq "-" (
    echo %%F = %type% file 
) else (
    echo %%F does not exist 
) 
) 
+0

ちょっとエコーの中のparenは何か目的を持っていますか? – wolfrevokcats

+1

@wolfrevokcats - 私は使用しました'ECHO'の代わりに 'ECHO'の代わりに空の文字列(またはスペースのみ)を使用していますが、私はちょうど正しい答えを与えることを認識しました。 '' ECHO is off'を返すことになり、これは相対的なものと判断されますが、2番目の部分は "存在しません"(正解)と判断されます終了結果 - いいえ、 'echo('、しかしそれでも害はありません。) – dbenham

+0

'\\'の代わりにバックスラッシュ '[\\]'の文字クラスを指定する特別な技術的な理由はありますか、またはそれは読みやすくするためのものですか? – aschipfl

関連する問題