私はbatスクリプトを作成しています。変数にはディレクトリの有効な絶対パスが含まれているかどうか、また別の変数に有効なファイル名Windows 8以上の場合ディレクトリまたはファイル名の絶対パスが有効かどうかを確認してください
どうすればこれらの小切手を受け取ることができますか?ここで
おかげ
さようなら
私はbatスクリプトを作成しています。変数にはディレクトリの有効な絶対パスが含まれているかどうか、また別の変数に有効なファイル名Windows 8以上の場合ディレクトリまたはファイル名の絶対パスが有効かどうかを確認してください
どうすればこれらの小切手を受け取ることができますか?ここで
おかげ
さようなら
は自明のコードです。 確認するパスを含む引数が必要です。
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
これはほとんどの人が気付くよりもはるかにトリッキーです。 SOやその他の場所で利用できるこのトピックに関する多くの誤解があります。多くの "ソリューション"が動作するように見えますが、特定の状況では失敗します。
問題は2つの部分に分けることができます:あなたは、単に「%%〜FF」またはパラメータ "変数FOR使用して完全なパスにパスを変換することはできません
1)絶対的または相対的
%〜f1 "を読み込み、絶対パスを書き込むことができる無限の方法があるので、元の文字列と一致するかどうかテストします(大文字と小文字を区別しません)。有効な絶対パスには、\..\
または\.\
の任意の数を含めることができます。また、絶対パスにはドライブ文字を使用するか、UNCパスでもかまいません。また、絶対パスには、その中に任意の数の"
を含めることができます。 、コロン、
私はパスが最初にすべての引用符を除去することによって、絶対的または相対的であるかどうかをテストし、その後、私はそれが次のいずれかで始まる場合FINDSTRをテストするために使用しますバックスラッシュに続く
2)は、ファイルやフォルダスラッシュまたは未存在
IF EXISTS path
を使用して、パスが有効かどうかを簡単に判断できます。しかし、ファイルをフォルダと区別することはより困難です。
DOSの時代に戻って、path\NUL
が存在するかどうかを確認し、そうであれば、そのパスがフォルダであることを知っていました。残念ながら、多くの人々は、これはWindowsで動作するという誤った印象の下にある - もう一つの頻繁な試みはpath\
が存在するかどうかをテストすることであり、もしそうなら、それはフォルダでなければならないことを前提としてい
私が使用する分類コードを含む場合には、は動作しません。バッチパラメータではなく環境変数です。
私は、ファイル/フォルダの属性を調べるのに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
)
)
ちょっとエコーの中のparenは何か目的を持っていますか? – wolfrevokcats
@wolfrevokcats - 私は使用しました'ECHO'の代わりに 'ECHO'の代わりに空の文字列(またはスペースのみ)を使用していますが、私はちょうど正しい答えを与えることを認識しました。 '' ECHO is off'を返すことになり、これは相対的なものと判断されますが、2番目の部分は "存在しません"(正解)と判断されます終了結果 - いいえ、 'echo('、しかしそれでも害はありません。) – dbenham
'\\'の代わりにバックスラッシュ '[\\]'の文字クラスを指定する特別な技術的な理由はありますか、またはそれは読みやすくするためのものですか? – aschipfl
ハズレを取得し、それをすべて一緒置きます。あなたの絶対パステストは、 '..'、' .'、 '' '、またはUNCパスの存在下で失敗することがあります。'%short_path%\ nul'テストは興味深いですが、ボリュームに対して短い8.3パス。[私の答え]を参照してください(http://stackoverflow.com/a/38170999/1012053) – dbenham