Nasıl dizin %YOL%olup olmadığını kontrol etmek için? | Netgez.com
SORU
26 EYLÃœL 2008, Cuma


Nasıl dizin %YOL%olup olmadığını kontrol etmek için?

Nasıl eğer bir dizin zaten PATH ortam değişkeni varsa kontrol eder? Bu bir başlangıç olsun. Kod ile yapmayı başardım altında olsa da, %PATH% ilk dizin echo. Bu döngü bir bu yana%, ama sadece ilkini alır %YOLDA dizinler numaralandırma olduğunu düşünebilirsin.

Bunu yapmanın daha iyi bir yolu var mı? Bulmak veya findstr gibi bir şey %PATH% değişkeni ameliyat? Sadece %zaten orada olabilecek bir şeyler ekleyerek önlemek için, eğer bir dizin listesinde olup olmadığını kontrol etmek için% YOLU istiyorum.

FOR /F "delims=;" %%P IN ("%PATH%") DO (
    @ECHO %%~P
)

CEVAP
8 Kasım 2011, Salı


İlk olarak bu sorunu çözmek için zor mükemmel hale getiren konularda bir dizi işaret eder. O zaman ile gelip mümkün olmuştur sunacağım.

Bu tartışma için dosya sisteminde tek bir klasör yolu göstermek için bir yol, ve büyük harf, küçük harf YOLUNU YOL ortam değişkeni temsil etmek için kullanacağım.

Pratik açıdan, çoğu insan ise YOLU belirli bir yolun mantıksal eşdeğer içeriyorsa, YOLU belirli bir yolun tam dize bir eşleşme olup olmadığını bilmek istiyorum. Bu soruna neden olabilir:

  1. Sondaki \ yol isteğe bağlıdır
    En yollar aynı derecede iyi ve \ sonunda her iki ile çalışır. Yol mantıksal olarak aynı konuma her halükarda puan. YOLU sık sık ve \ firar olan ve olmayan yolları bir karışım vardır. Bu muhtemelen bir maç için bir YOL ararken en yaygın pratik konudur.

    • Bunun bir istisnası vardır: C: göreli yol (C sürücüsünün geçerli çalışma dizini anlam) C:\ (C sürücüsünün kök dizin anlamında)çok daha farklı.
  2. Bazı yollar kısa isimler var
    Eski 8.3 standardına uygun olmayan herhangi bir yol standardını karşılıyor mu alternatif kısa bir form var. Bu özellikle iş dünyasında bazı frekans ile daha önce görmedim, o başka bir YOL konudur.

  3. Windows bir yolunu içindeki klasör ayırıcı olarak / \ her ikisi de kabul eder.
    Bu çok sık görülen, ama bir yolu kullanılarak belirtilebilir / yerine \ ve sadece iyi işlev içinde YOLU (yanı sıra pek çok diğer Windows bağlamlarda)

  4. Windows bir mantıksal ayırıcı olarak üst üste klasör ayırıcı davranır.
    C:\FOLDER\\ ve C:\FOLDER\ eşdeğerdir. Bu aslında bir geliştirici genellikle \ sondaki zaten var olmadığını kontrol etmek için rahatsız olmadan bir yolu \ ekleyebilirsiniz çünkü bir yol ile ilgili birçok konuda yardımcı olur. Ama bu haliyle tam bir dize maç gerçekleştirmeye sorunlara yol açabilir.

    • Ä°stisnalar: sadece C:\ (geçerli bir yol) C:\,, C:\\ daha farklı daha C: farklı (geçersiz bir yol).
  5. Windows dosya ve dizin isimleri için sondaki nokta ve boşlukları kırpar.
    "C:\test. " "C:\test" eÅŸdeÄŸerdir.

  6. .\, veli ..\ klasör geçerli belirteçleri bir yol içinde görünebilir
    Olası gerçek hayatta görülebilir, ama C:\.\parent\child\..\.\child\ gibi bir şey C:\parent\child eşdeğerdir

  7. Bir yolunu isteğe bağlı olarak çift tırnak içinde kapalı olabilir.
    Yolu sık sık 26* , ; ^ & =*gibi özel karakterler karşı korumak için tırnak içinde.. Tırnak aslında daha önce, içinde " yol/sonra görünebilir. Özel karakterler karşı koruma amacı dışında Windows tarafından göz ardı edilir. Tırnak hiç bir yolu ; ama tırnak işaretleri mevcut-daha az olabilir bir içermediği sürece YOL içinde gereklidir.

  8. Bir yolu, tam veya göreli olabilir.
    Tam yolu dosya sistemi içinde tam olarak belirli bir konuma işaret eder. Göreli yol bir yerde geçerli çalışma birimleri ve dizinleri değerine bağlı olarak değişir. Göreceli yollar üç ana çeşidi vardır:

    • D:birimin geçerli çalışma dizini D göredir:
    • \myPathgeçerli çalışma hacmine göre (C:, D: vb.)
    • myPathgeçerli çalışma hacmi ve dizini

    Tamamen yasal YOL içinde göreli bir yol vardır. Bu Unıx varsayılan olarak geçerli dizin aramaz çünkü Unix dünyasında çok yaygındır, Unıx için bir YOL genellikle .\ içerir. Ancak Windows varsayılan olarak geçerli dizin arama yapar, göreli yollar Windows YOLA nadirdir.

Eğer YOLU zaten bir yol varsa, güvenilir bir şekilde kontrol etmek için (standart) standart bir forma herhangi bir yol dönüştürmek için bir yol bulmamız gerekiyor. ~s değiştirici değişken ve bağımsız değişken genişleme İÇİN kullanılan adresler 1 - 6, sorunları ve kısmen sorun 7 gideren basit bir yöntemdir. ~s değiştirici çevreleyen tırnak işaretleri kaldırır, ama iç tırnakları korur. Sorun 7 tamamen açıkça tüm yollar teklif karşılaştırma önce kaldırarak çözülebilir. Eğer bir yolu fiziksel olarak mevcut değilse ~s değiştirici ne de geçerli 8.3 bir biçime dönüştürür yolu yolu \ ekleme, unutmayın.

~s ile sorun tam olarak nitelenmiş yollar dışındaki yolları dönüştürür. Bu Sorun 8 için göreli bir yol hiç bir zaman tam olarak nitelenmiş bir yol eşleşmesi gerekir, çünkü sorunlu. FİNDSTR düzenli ifadeler ya da tam veya göreli bir yol sınıflandırmak için kullanabiliriz. Tam normal bir yol <letter>:<separator> <letter>:<separator><separator> nereye <ayırıcı^ ile başlamalıdır . \ / ya. UNC yolları her zaman tam ve \\ ile başlamalı. Tam yollar karşılaştırırken ~s değiştirici kullanıyoruz. Göreceli yollar karşılaştırırken ham dizeleri kullanıyoruz. Son olarak, biz hiçbir zaman göreli bir yol için tam yolu karşılaştırın. Bu strateji Sorunu 8 için iyi pratik bir çözüm sağlar. Tek sınırlama mantıksal olarak eşdeğer iki göreli yollar eşleşen değil gelebilir, ama bu göreceli yollar Windows YOLA nadirdir, çünkü önemsiz bir sorun.

Bu konuya bazı Ek sorunlar vardır:

9)Normal genişleme özel karakterler içeren bir YOL ile ilgili zaman güvenilir değildir.
Özel karakterler, YOL içindeki kote olması gerekmez, ama onlar olabilir. Bir YOL gibi yani C:\THIS & THAT;"C:\& THE OTHER THING" mükemmel geçerli olduğunu, ama güvenli bir şekilde "%PATH%" ve %PATH% her ikisi de başarısız olur çünkü basit genişleme kullanarak genişletilemez.

10)Yol sınırlayıcı da yol adı içinde geçerlidir
; YOL içinde yollar sınırlandırmak için kullanılır, ama ; bu durumda yolu tırnak gerekir bir yol içinde geçerli bir karakter olabilir. Bu ayrıştırma bir sorun neden olur.

jeb 'Pretty print' windows %PATH% variable - how to split on ';' in CMD shell hem sorunları 9 ve 10 çözdü

Eğer belirli bir yol zaten YOL içinde varsa jeb YOLU ayrıştırıcı benim bulduğum ile birlikte ~s değiştirici ve yol sınıflandırma teknikleri kontrol etmek için neredeyse kurşun geçirmez bu çözüm için birleştirebiliriz. Fonksiyonu bulunan ve bir toplu iş dosyası içinden çağrılabilir, ya da tek başına ve kendi inPath olarak çağrılabilir.bat toplu iş dosyası. Kod bir sürü gibi görünüyor, ama yarısından fazlası yorum.

@echo off
:inPath pathVar
::
::  Tests if the path stored within variable pathVar exists within PATH.
::
::  The result is returned as the ERRORLEVEL:
::    0 if the pathVar path is found in PATH.
::    1 if the pathVar path is not found in PATH.
::    2 if pathVar is missing or undefined or if PATH is undefined.
::
::  If the pathVar path is fully qualified, then it is logically compared
::  to each fully qualified path within PATH. The path strings don't have
::  to match exactly, they just need to be logically equivalent.
::
::  If the pathVar path is relative, then it is strictly compared to each
::  relative path within PATH. Case differences and double quotes are
::  ignored, but otherwise the path strings must match exactly.
::
::------------------------------------------------------------------------
::
:: Error checking
if "%~1"=="" exit /b 2
if not defined %~1 exit /b 2
if not defined path exit /b 2
::
:: Prepare to safely parse PATH into individual paths
setlocal DisableDelayedExpansion
set "var=%path:"=""%"
set "var=%var:^=^^%"
set "var=%var:&=^&%"
set "var=%var:|=^|%"
set "var=%var:<=^<%"
set "var=%var:>=^>%"
set "var=%var:;=^;^;%"
set var=%var:""="%
set "var=%var:"=""Q%"
set "var=%var:;;="S"S%"
set "var=%var:^;^;=;%"
set "var=%var:""="%"
setlocal EnableDelayedExpansion
set "var=!var:"Q=!"
set "var=!var:"S"S=";"!"
::
:: Remove quotes from pathVar and abort if it becomes empty
set "new=!%~1:"=!"
if not defined new exit /b 2
::
:: Determine if pathVar is fully qualified
echo("!new!"|findstr /i /r /c:^"^^\"[a-zA-Z]:[\\/][^\\/]" ^
                           /c:^"^^\"[\\][\\]" >nul ^
  && set "abs=1" || set "abs=0"
::
:: For each path in PATH, check if path is fully qualified and then do
:: proper comparison with pathVar.
:: Exit with ERRORLEVEL 0 if a match is found.
:: Delayed expansion must be disabled when expanding FOR variables
:: just in case the value contains !
for %%A in ("!new!\") do for %%B in ("!var!") do (
  if "!!"=="" endlocal
  for %%C in ("%%~B\") do (
    echo(%%B|findstr /i /r /c:^"^^\"[a-zA-Z]:[\\/][^\\/]" ^
                           /c:^"^^\"[\\][\\]" >nul ^
      && (if «s%==1 if /i "%%~sA"=="%%~sC" exit /b 0) ^
      || (if «s%==0 if /i "%%~A"=="%%~C" exit /b 0)
  )
)
:: No match was found so exit with ERRORLEVEL 1
exit /b 1

İşlevi (toplu dosya varsayarak inPath olarak adlandırılır.bunun gibi kullanılabilir bat):

set test=c:\mypath
call inPath test && (echo found) || (echo not found)

path %path%;%newPath% gibi bir şey kullanılarak yapılır. Ama Sorun 9 Bu güvenilir olmadığı gösterilmiştir.

Başka bir sorun, özellikle Eğer fonksiyonu gecikmeli genişleme etkin veya devre dışı olarak adlandırılabilir eğer işlevi sonunda ENDLOCAL bariyer arasında son YOL değeri dönmek için nasıl. Herhangi bir ! gecikmeli genişleme etkinse değeri bozulmasına neden çıkmamış.

Bu sorunlar jeb burada icat inanılmaz güvenli bir dönüş tekniği kullanılarak çözümlenir: http://www.dostips.com/forum/viewtopic.php?p=6930#p6930

@echo off
:addPath pathVar /B
::
::  Safely appends the path contained within variable pathVar to the end
::  of PATH if and only if the path does not already exist within PATH.
::
::  If the case insensitive /B option is specified, then the path is
::  inserted into the front (Beginning) of PATH instead.
::
::  If the pathVar path is fully qualified, then it is logically compared
::  to each fully qualified path within PATH. The path strings are
::  considered a match if they are logically equivalent.
::
::  If the pathVar path is relative, then it is strictly compared to each
::  relative path within PATH. Case differences and double quotes are
::  ignored, but otherwise the path strings must match exactly.
::
::  Before appending the pathVar path, all double quotes are stripped, and
::  then the path is enclosed in double quotes if and only if the path
::  contains at least one semicolon.
::
::  addPath aborts with ERRORLEVEL 2 if pathVar is missing or undefined
::  or if PATH is undefined.
::
::------------------------------------------------------------------------
::
:: Error checking
if "%~1"=="" exit /b 2
if not defined %~1 exit /b 2
if not defined path exit /b 2
::
:: Determine if function was called while delayed expansion was enabled
setlocal
set "NotDelayed=!"
::
:: Prepare to safely parse PATH into individual paths
setlocal DisableDelayedExpansion
set "var=%path:"=""%"
set "var=%var:^=^^%"
set "var=%var:&=^&%"
set "var=%var:|=^|%"
set "var=%var:<=^<%"
set "var=%var:>=^>%"
set "var=%var:;=^;^;%"
set var=%var:""="%
set "var=%var:"=""Q%"
set "var=%var:;;="S"S%"
set "var=%var:^;^;=;%"
set "var=%var:""="%"
setlocal EnableDelayedExpansion
set "var=!var:"Q=!"
set "var=!var:"S"S=";"!"
::
:: Remove quotes from pathVar and abort if it becomes empty
set "new=!%~1:"^=!"
if not defined new exit /b 2
::
:: Determine if pathVar is fully qualified
echo("!new!"|findstr /i /r /c:^"^^\"[a-zA-Z]:[\\/][^\\/]" ^
                           /c:^"^^\"[\\][\\]" >nul ^
  && set "abs=1" || set "abs=0"
::
:: For each path in PATH, check if path is fully qualified and then
:: do proper comparison with pathVar. Exit if a match is found.
:: Delayed expansion must be disabled when expanding FOR variables
:: just in case the value contains !
for %%A in ("!new!\") do for %%B in ("!var!") do (
  if "!!"=="" setlocal disableDelayedExpansion
  for %%C in ("%%~B\") do (
    echo(%%B|findstr /i /r /c:^"^^\"[a-zA-Z]:[\\/][^\\/]" ^
                           /c:^"^^\"[\\][\\]" >nul ^
      && (if «s%==1 if /i "%%~sA"=="%%~sC" exit /b 0) ^
      || (if «s%==0 if /i %%A==%%C exit /b 0)
  )
)
::
:: Build the modified PATH, enclosing the added path in quotes
:: only if it contains ;
setlocal enableDelayedExpansion
if "!new:;=!" neq "!new!" set new="!new!"
if /i "%~2"=="/B" (set "rtn=!new!;!path!") else set "rtn=!path!;!new!"
::
:: rtn now contains the modified PATH. We need to safely pass the
:: value accross the ENDLOCAL barrier
::
:: Make rtn safe for assignment using normal expansion by replacing
:: % and " with not yet defined FOR variables
set "rtn=!rtn:%%=%%A!"
set "rtn=!rtn:"=%%B!"
::
:: Escape ^ and ! if function was called while delayed expansion was enabled.
:: The trailing ! in the second assignment is critical and must not be removed.
if not defined NotDelayed set "rtn=!rtn:^=^^^^!"
if not defined NotDelayed set "rtn=%rtn:!=^^^!%" !
::
:: Pass the rtn value accross the ENDLOCAL barrier using FOR variables to
:: restore the % and " characters. Again the trailing ! is critical.
for /f "usebackq tokens=1,2" %%A in ('%%^ ^"') do (
  endlocal & endlocal & endlocal & endlocal & endlocal
  set "path=%rtn%" !
)
exit /b 0

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Angry Paintballer

    Angry Paintb

    8 Ocak 2012
  • Mark Hyder

    Mark Hyder

    6 EKÄ°M 2011
  • SuicideSheeep

    SuicideSheee

    8 Ocak 2012