Bir parametrenin bir toplu iş dosyasında boş olup olmadığını test etmenin uygun yolu nedir?


213

Bir değişkenin ayarlanıp ayarlanmadığını test etmem gerekiyor. Ben çeşitli teknikler denedim ama her başarısız görünüyor %1zaman böyle bir durum olarak tırnak ile çevrilidir %1olduğunu "c:\some path with spaces".

IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.

Bu siteye göre , bunlar desteklenen IFsözdizimi türleridir. Yani, bunu yapmanın bir yolunu göremiyorum.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

1
Sistemlerimde (Windows 2003 ve Windows 7), çift ​​sayıda çift tırnak if "%1" == "" GOTO MyLabelolduğu sürece komut dosyasının yürütülmesini ölümcül bir şekilde öldürmez %1. Görüyorum ki çift tırnak çift sayı %1bu hatayla komut yürütülmesini öldürür: The syntax of the command is incorrect.Sorunu çözmek için köşeli ayraç kullanan aşağıdaki çözüm doğru cevap olarak işaretlenmiş ama daha iyi yapıyor gibi görünmüyor . Tek %1bir çift tırnak işareti olduğunda bu çözüm de aynı hatayla başarısız olur .
Susam Pal

@SusamPal İlginç. Altındaki parantez sürümünü deneyin ve çalışıp çalışmadığına bakın. Daha fazla test ettiğim. Kabul edilen cevabı birkaç gün önce güncelledim.
blak3r

Dan Story'nin cevabı gerçekten işe yarıyor gibi görünüyor. Sürümü köşeli parantez kullanarak kullandım.
Susam Pal

iyi bir "tümünü yakala" örneği: stackoverflow.com/questions/830565/… argümanında hem dosya / dizin hem de genel dize / sayı karmasını kapsayan.

Bu yüzden sinir bozucu - IF DEFINEDsenaryo değişkenleri yerine sadece çevre değişkenleri üzerinde çalışmak potansiyel bir israftır!
kayleeFrye_onDeck

Yanıtlar:


290

Tırnak işaretleri yerine köşeli parantez kullanın:

IF [%1] == [] GOTO MyLabel

Parantezler güvensizdir : sadece köşeli parantez kullanın.


11
parantez güvenli değil! Gibi içerik &in %1çizgisini kıracak
jeb

14
Bağımsız değişkente boşluk olmadığı sürece if #%1#==##veya gibi diğer karakterleri kullanmak if [%1]==[]iyidir, aksi takdirde bir …was unexpected at this timehata alırsınız .
Synetech

12
Cevabımda da belirttiğim gibi kullanmak "%~1"gerçekten daha iyi bir yaklaşım.
jamesdlin

8
Millet, @jamesdlin doğru. Değişken metinde boşluk veya varsa bu yaklaşım çalışmaz ==. Onun cevabını kullan.
James Ko

4
Bunu netleştirmiyorsun it DOES NOT work with spaces. Bunun yerine @ jamesdlin yanıtını kullanın.
JB. Monica ile.

153

Kullanabilirsiniz:

IF "%~1" == "" GOTO MyLabel

dış tırnak kümesini çıkarmak için. Genel olarak, bu köşeli parantez kullanmaktan daha güvenilir bir yöntemdir, çünkü değişkenin içinde boşluklar olsa bile çalışacaktır.


9
Bu gerçekten bunu yapmanın iyi bir yoludur. Kullanarak ~, eğer varsa dış tırnakları sıyırırsınız, daha sonra manuel olarak geri eklersiniz (sadece bir set sağlar). Üstelik sahip argüman boşluk içeriyorsa tırnak kullanmayı (Bu kullanmanın önceki versiyonu zor yoldan öğrendim #ya parantez yerine tırnak bir atmak için boşluk içeren tartışmalara neden …was unexpected at this timehata.)
Synetech

4
bu% 1 gibi bağımsız değişkenler yerine% MYVAR% gibi genel değişkenler için de geçerli mi?
simpleuser

4
@simpleuser Hata, haklısın, genel ortam değişkenleriyle çalışmaz.
jamesdlin

1
kaçış dizisi olarak double '"' kullanan dizelere dikkat edin - karşılaştırma yapıldığında komut dosyası çökecektir ""this string will crash the comparison"". Örn ." '' Double doğru kaçış dizisidir ve dize boş
Tydaeus

1
@Amalgovinus Değişkeni bir alt rutine argüman olarak iletebilir ve alt rutinin kullanılmasına izin verebilirsiniz "%~1".
jamesdlin

38

En iyi yarı çözümlerden biri %1bir değişkene kopyalamak ve sonra delayedExp gibi gecikmeli genişleme kullanmaktır. herhangi bir içeriğe karşı her zaman güvenlidir.

set "param1=%~1"
setlocal EnableDelayedExpansion
if "!param1!"=="" ( echo it is empty )
rem ... or use the DEFINED keyword now
if defined param1 echo There is something

Bunun avantajı, param1 ile başa çıkmanın mutlak olarak güvenli olmasıdır.

Ve param1'in ayarı,

test.bat hello"this is"a"test
test.bat you^&me

Ama yine de garip içeriklerle başarısız oluyor

test.bat ^&"&

Varlığa% 100 doğru cevap alabilmek

%1Boş olup olmadığını algılar , ancak bazı içerikler için içeriği getiremez.
Bu aynı zamanda boş olanla %1olanı ayırt etmek için de yararlı olabilir "". Toplu iş dosyasını iptal etmeden komutun başarısız
olma yeteneğini kullanır CALL.

@echo off
setlocal EnableDelayedExpansion
set "arg1="
call set "arg1=%%1"

if defined arg1 goto :arg_exists

set "arg1=#"
call set "arg1=%%1"
if "!arg1!" EQU "#" (
    echo arg1 exists, but can't assigned to a variable
    REM Try to fetch it a second time without quotes
    (call set arg1=%%1)
    goto :arg_exists
)

echo arg1 is missing
exit /b

:arg_exists
echo arg1 exists, perhaps the content is '!arg1!'

İçeriği almak için% 100 kurşun geçirmez olmak istiyorsanız , en garip komut satırı parametrelerini nasıl alabilirim?


18

EĞER / ?:

Komut Uzantıları etkinse EĞER aşağıdaki gibi değişir:

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

......

DEFINED koşulu, EXISTS gibi çalışır, ancak ortam değişkeni adını alır ve ortam değişkeni tanımlanmışsa true değerini döndürür.


1
Evet, aslında bu yaklaşımı denedim ve söyleyebileceğimden sadece ÇEVRE değişkenleri ile çalışıyor. Bu nedenle,% 1 veya toplu iş dosyası içinde tanımlanan bir değişkenle çalışmadı.
blak3r

2
Bu sadece %1ve benzerleri için geçerlidir . "Toplu iş dosyası içinde tanımlanan değişkenler" aslında olan toplu iş dosyası çalışırken ortam değişkenleri ve kullanabileceğiniz IF DEFINEDonlara.
zb226

8

Maalesef kendi cevaplarımı yazmak zorunda olduğum cevaplar hakkında yorum yapmak veya oy vermek için yeterli üne sahip değilim.

Başlangıçta OP'nin sorusu "parametre" yerine "değişken" dedi, bu özellikle kafa karıştırıcıları nasıl test edileceğini araştırmak için Google'da bir numaralı bağlantı olduğu için çok kafa karıştırıcıydı. Orijinal cevabımdan bu yana, Stephan orijinal soruyu doğru terminolojiyi kullanmak için düzenledi, ancak cevabımı silmek yerine herhangi bir karışıklığı gidermeye yardımcı olmak için bırakmaya karar verdim, özellikle de google hala insanları değişkenler için buraya gönderiyorsa:

% 1 DEĞİŞKEN DEĞİL! KOMUT HATTI PARAMETRESİDİR.

Çok önemli bir ayrım. Değişken değil bir komut satırı parametresine başvurduktan sonra sayı içeren tek bir yüzde işareti.

Değişkenler set komutu kullanılarak ayarlanır ve yüzde 2 işareti kullanılarak çağrılır - bir önceki ve bir sonraki. Örneğin,% myvar%

Boş bir değişkeni test etmek için "tanımlı değilse" sözdizimini kullanırsınız (değişkenler için açıkça komutlar yüzde işareti gerektirmez), örneğin:

set myvar1=foo  
if not defined myvar1 echo You won't see this because %myvar1% is defined.  
if not defined myvar2 echo You will see this because %myvar2% isn't defined.

(Komut satırı parametrelerini test etmek istiyorsanız, jamesdlin'in cevabına bakmanızı tavsiye ederim.)


1
Haklısın. Ama doğru yolu sadece başlığını düzeltmek için olurdu if variable is emptyiçin if parameter is empty. Sadece yaptım. (parametreler yerine değişkenleri kontrol eden ve bu nedenle soruya cevap vermedikleri için geçersiz olan bazı cevapları geçersiz kılma riski altındadır)
Stephan

1
Tamam teşekkürler Stephan, bunu yapabileceğinin farkında değildim. Cevabımı güncellemeyi yansıtacak şekilde düzenledim.
AutoMattTick

6

Toplu iş dosyasındaki değişkeni test etmek için "IF DEFINED değişken komutu" nu kullanın.

Ancak toplu parametreleri test etmek istiyorsanız, zor girişlerden kaçınmak için aşağıdaki kodları deneyin ("1 2" veya ab ^> cd gibi)

set tmp="%1"
if "%tmp:"=.%"==".." (
    echo empty
) else (
    echo not empty
)

5

Aşağıdaki kod ile test ve gayet iyi.

@echo off

set varEmpty=
if not "%varEmpty%"=="" (
    echo varEmpty is not empty
) else (
    echo varEmpty is empty
)
set varNotEmpty=hasValue
if not "%varNotEmpty%"=="" (
    echo varNotEmpty is not empty
) else (
    echo varNotEmpty is empty
)

Değişken bir alıntı içerdiğinde çözümünüz başarısız olur. Btw IF DEFINED varbir nedenle sözdizimi var
jeb

4

Genellikle bunu kullanıyorum:

IF "%1."=="." GOTO MyLabel

% 1 boşsa, EĞER "." "." ki bu doğru olarak değerlendirilecektir.


4
Bu yanlış. Bu aynı şeydir: EĞER "% 1" == "" EĞER bu yazının nedeni% 1'in kendisinde tırnak işareti varsa başarısız olur.
blak3r

% 1'in boş olup olmadığını veya tırnak işareti olup olmadığını test etmeye mi çalışıyorsunuz? Soru belirsiz. % 1 için komut satırında hiçbir şey belirtilmezse cevabım çalışır.
aphoria

>% 1'in boş olup olmadığını veya tırnak işareti olup olmadığını test etmeye mi çalışıyorsunuz? @aphoria, her ikisini de ele alabilmelidir.
Synetech

Bunu% 1% ayarlanmışsa, benim için iyi çalıştıysa işe yarar. Teşekkürler, iyi cevap!
Charlie A

4

Bu küçük toplu komut dosyasını, birçok geçerli olan olduğu için buradaki cevaplara dayanarak oluşturdum. Aynı biçimi izlediğiniz sürece buna eklemekten çekinmeyin:

REM Parameter-testing

Setlocal EnableDelayedExpansion EnableExtensions

IF NOT "%~1"=="" (echo Percent Tilde 1 failed with quotes) ELSE (echo SUCCESS)
IF NOT [%~1]==[] (echo Percent Tilde 1 failed with brackets) ELSE (echo SUCCESS)
IF NOT  "%1"=="" (echo Quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1]==[] (echo Brackets one failed) ELSE (echo SUCCESS)
IF NOT "%1."=="." (echo Appended dot quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1.]==[.] (echo Appended dot brackets one failed) ELSE (echo SUCCESS)

pause

4

Boş dize bir çift double-quotes/ "", sadece uzunluğu test edebiliriz:

set ARG=%1
if not defined ARG goto nomore

set CHAR=%ARG:~2,1%
if defined CHAR goto goon

sonra 2 karakteri test edin double-quotes:

if ^%ARG:~1,1% == ^" if ^%ARG:~0,1% == ^" goto blank
::else
goto goon

İşte oynayabileceğiniz bir toplu iş betiği. Boş dizeyi düzgün bir şekilde yakaladığını düşünüyorum.

Bu sadece bir örnektir, betiğinize göre yukarıdaki 2 (veya 3?) Adımı özelleştirmeniz yeterlidir.

@echo off
if not "%OS%"=="Windows_NT" goto EOF
:: I guess we need enableExtensions, CMIIW
setLocal enableExtensions
set i=0
set script=%0

:LOOP
set /a i=%i%+1

set A1=%1
if not defined A1 goto nomore

:: Assumption:
:: Empty string is (exactly) a pair of double-quotes ("")

:: Step out if str length is more than 2
set C3=%A1:~2,1%
if defined C3 goto goon

:: Check the first and second char for double-quotes
:: Any characters will do fine since we test it *literally*
if ^%A1:~1,1% == ^" if ^%A1:~0,1% == ^" goto blank
goto goon

:goon
echo.args[%i%]: [%1]
shift
goto LOOP

:blank
echo.args[%i%]: [%1] is empty string
shift
goto LOOP

:nomore
echo.
echo.command line:
echo.%script% %*

:EOF

Bu işkence testi sonucu:

.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
args[1]: [::]
args[2]: [""] is empty string
args[3]: [">"""bl" "]
args[4]: ["< "">"]
args[5]: [(")(")]
args[6]: [""] is empty string
args[7]: [::]
args[8]: [""-"  "]
args[9]: ["( )"">\>"]
args[10]: [""] is empty string

command line:
.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""

Yanlış, boş bir dize iki çift tırnaklı ""bir dize değildir, boş bir dize boş bir dizedir `` ve toplu işte boş bir değişken tanımsız bir değişkendir. Argümanlarınız için dış tırnakların kaldırılacağını tanımlayabilirsiniz, ancak daha sonra dize 0 uzunluğu ile hala boştur
jeb

Bu bağlamda (win cmd argümanları), boş bir dizeyi başka bir yolla gösteremezsiniz, unix kabuğunun altında eşit derecede boş olan çift tek tırnakla bile değil.
user6801759

Evet, ""boş dizeler için de kullanılır, ancak %~1dış tırnak işaretlerini kaldırmak oldukça kolaydır . böyle karmaşık bir çözüm kullanmaya gerek yoktur
jeb

Haklısın, yanlış ifade ettim, sadece boş dize için değil, aynı zamanda argümanları numaralandırmak için güvenli bir yol. Gibi diğer yollar geçerli bir "%~1"==""argüman gibi argüman ile başarısız olacaktır "Long File Name".txt. edit : Ve kesinlikle dediğin gibi karmaşık değil. Test için sadece 2 adım yukarıda, gerisi ayrıntılı bir örnektir.
user6801759

"ARG tanımlı değilse" mükemmel çalışıyor gibi görünüyor (değişkenim komut satırından gelmiyor)
GrayFace


3

Komut Dosyası 1:

Girdi ("Kaldır Quotes.cmd" "Bu bir Testtir")

@ECHO OFF

REM Set "string" variable to "first" command line parameter
SET STRING=%1

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

REM IF %1 [or String] is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel


REM   OR   IF "." equals "." GOTO MyLabel
IF "%STRING%." == "." GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

PAUSE

Çıktı (Yok,% 1 boş, boş veya NULL DEĞİLDİR):


Yukarıdaki komut dosyası ile herhangi bir parametre olmadan çalıştırın ("Kaldır Quotes.cmd") 1

Çıktı (% 1 boş, boş veya NULL):

Welcome!

Press any key to continue . . .

Not: Bir değişkenin içine IF ( ) ELSE ( ) ifadenin , "IF" ifadesinden çıkana kadar DEFINED tarafından kullanılamaz ("Gecikmeli Değişken Genişletme" etkinleştirilmedikçe; etkinleştirildikten sonra, yerine bir ünlem işareti "!" Kullanın yüzde "%" simgesi}.

Örneğin:

Komut Dosyası 2:

Girdi ("Kaldır Quotes.cmd" "Bu bir Testtir")

@ECHO OFF

SETLOCAL EnableDelayedExpansion

SET STRING=%0
IF 1==1 (
  SET STRING=%1
  ECHO String in IF Statement='%STRING%'
  ECHO String in IF Statement [delayed expansion]='!STRING!'
) 

ECHO String out of IF Statement='%STRING%'

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

ECHO String without Quotes=%STRING% 

REM IF %1 is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

ENDLOCAL
PAUSE

Çıktı:

C:\Users\Test>"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd" "This is a Test"  
String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is a Test"'  
String out of IF Statement='"This is a Test"'  
String without Quotes=This is a Test  

C:\Users\Test>  

Not: Ayrıca dizenin içindeki tırnak işaretlerini de kaldıracaktır.

Örneğin (komut dosyası 1 veya 2'yi kullanarak): C: \ Users \ Test \ Documents \ Batch Files> "Quotes.cmd dosyasını kaldır" "Bu" bir "Test"

Çıktı (Kod 2):

String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is "a" Test"'  
String out of IF Statement='"This is "a" Test"'  
String without Quotes=This is a Test  

Komut Dosyası 2'de herhangi bir parametre olmadan ("Quotes.cmd" dosyasını yürütün):

Çıktı:

Welcome!

Press any key to continue . . .

3

Özetlemek gerekirse:

set str=%~1
if not defined str ( echo Empty string )

% 1 "" veya "veya boşsa bu kod" Boş dize "çıktısı verir. Şu anda yanlış olan kabul edilen yanıta eklendi.


0

İnternette birçok cevabı olan birçok sorun yaşadım. Çoğu, çoğu şey için çalışır, ancak her zaman her birini kıran bir köşe davası vardır.
Belki tırnak varsa işe yaramaz, belki tırnak yoksa kırılır, var bir boşluk varsa sözdizimi hatası, bazıları sadece parametreler üzerinde çalışır (çevre değişkenlerinin aksine), diğer teknikler boş tırnak işareti 'tanımlanmış' olarak geçmek ve bazı daha zor olanlar daha elsesonra zincirleme izin vermez .

İşte memnun olduğum bir çözüm, lütfen işe yaramayacak bir köşe davası bulursanız bana bildirin.

:ifSet
if "%~1"=="" (Exit /B 1) else (Exit /B 0)

Bu altyordamın bir betiğinizde veya kendi başına .batolması işe yarayacaktır.
Eğer yazmak istiyorsanız (sözde):

if (var)
then something
else somethingElse

Yazabilirsin:

(Call :ifSet %var% && (
    Echo something
)) || (
    Echo something else
)

Tüm testlerim için çalıştı:

(Call :ifSet && ECHO y) || ECHO n
(Call :ifSet a && ECHO y) || ECHO n
(Call :ifSet "" && ECHO y) || ECHO n
(Call :ifSet "a" && ECHO y) || ECHO n
(Call :ifSet "a a" && ECHO y) || ECHO n

Yankılı n,y , n, y,y


Daha fazla örnek:

  • Sadece kontrol etmek istiyorum if misin?Call :ifSet %var% && Echo set
  • Sadece değilse (sadece başka)? Call :ifSet %var% || Echo set
  • Başarılı bir argümanı kontrol etmek; iyi çalışıyor.Call :ifSet %1 && Echo set
  • Komut dosyalarınızı / dupe kodunuzu tıkamak istemediniz, bu yüzden kendi başına ifSet.batmı koydunuz ? Sorun değil:((Call ifSet.bat %var%) && Echo set) || (Echo not set)

Bir dava buldum; İf sözdizimini başka bir sözdizimiyle denerseniz ve then bloğundaki son komut başarısız olursa (Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo, diğeri yürütür:, echos true ve false
Hashbrown

Aslında, bu bir konuysa ve fazladan bir hatla başa çıkabiliyorsanız ifSet, kendi başınıza arayarak ve ardındanIf %errorlevel% EQU 0 (x) Else (y)
Hashbrown

Kabul edilen cevap (köşeli parantez kullanın) hangi durumlarda çalışmaz? Ve Exit / B'nin ne yaptığını açıklayabilir misiniz
blak3r

bazı nedenlerden dolayı test ettiğimde setdeğişkenler kullanılırken bozuldu ( [%bob%]sadece gibi argümanlar için çalışıyor [%2]) ama şimdi tekrar kontrol etmek işe yarıyor. Sanırım []şimdi benim tek yakınma boş tırnak geçmesine izin verir, oysa bu alışkanlık (bu yüzden gerçekten kullanım durumunuza bağlıdır)
Hashbrown

/BBayrağı yalnızca alt yordamı veya çıkarken çıkmasını bütün toplu durur calld' toplu. Ne soruyorsun sürece bütün komuta yapıyor; çağıran komut dosyasının , yanıtta boole mantığı yoluyla veya yukarıdaki yorumlarda kullanılabilen alt rutinin ( 0geçiş, 1başarısız) sonucunu bildirmesine izin vermek için bir hata kodu döndürüyor%errorlevel%
Hashbrown

0

Kullanıyor! yerine "boş dize kontrolü için

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty

1
İpucu gerçekten kötü. Tırnak işaretleri en azından boşlukları ve özel karakterleri işleyebilir, ancak ünlem işaretleri kullanamaz. Ve ünlem işaretleri, gecikmeli genişleme etkinleştirildiğinde gerçekten kötü oluyor
jeb

0

Bir aydan daha kısa bir süre içinde girdim (8 yıl önce sorulmasına rağmen) ... Umarım toplu iş dosyalarının ötesine geçmiştir. ;-) Bunu her zaman yapardım. Yine de nihai hedefin ne olduğundan emin değilim. Benim gibi tembelse, go.bat benim gibi şeyler için çalışır. (Aşağıya bakın) Ancak, girişi doğrudan komut olarak kullanıyorsanız OP 1'deki komut geçersiz olabilir. yani

"C:/Users/Me"

geçersiz bir komuttur (veya farklı bir sürücüdeyseniz kullanılır). Onu iki parçaya bölmelisin.

C:
cd /Users/Me

Ve 2, 'tanımlanmış' veya 'tanımsız' ne anlama geliyor? GIGO. Hataları yakalamak için varsayılanı kullanıyorum. Giriş yakalanmazsa, yardıma (veya varsayılan bir komuta) düşer. Yani, hiçbir girdi bir hata değildir. Girişe cd yazmayı deneyebilir ve varsa hatayı yakalayabilirsiniz. (Tamam, go "indirmeleri (yalnızca bir paren) kullanarak DOS tarafından yakalanır. (Sert!))

cd "%1"
if %errorlevel% neq 0 goto :error

Ve 3, tırnak işaretleri komutun değil, sadece yolun etrafında gereklidir. yani

"cd C:\Users" 

farklı bir sürücüde olmadıkça kötüydü (ya da eski günlerde alışkın).

cd "\Users" 

işlevseldir.

cd "\Users\Dr Whos infinite storage space"

yolunuzda boşluk varsa çalışır.

@REM go.bat
@REM The @ sigh prevents echo on the current command
@REM The echo on/off turns on/off the echo command. Turn on for debugging
@REM You can't see this.
@echo off
if "help" == "%1" goto :help

if "c" == "%1" C:
if "c" == "%1" goto :done

if "d" == "%1" D:
if "d" == "%1" goto :done

if "home"=="%1" %homedrive%
if "home"=="%1" cd %homepath%
if "home"=="%1" if %errorlevel% neq 0 goto :error
if "home"=="%1" goto :done

if "docs" == "%1" goto :docs

@REM goto :help
echo Default command
cd %1
if %errorlevel% neq 0 goto :error
goto :done

:help
echo "Type go and a code for a location/directory
echo For example
echo go D
echo will change disks (D:)
echo go home
echo will change directories to the users home directory (%homepath%)
echo go pictures
echo will change directories to %homepath%\pictures
echo Notes
echo @ sigh prevents echo on the current command
echo The echo on/off turns on/off the echo command. Turn on for debugging
echo Paths (only) with folder names with spaces need to be inclosed in         quotes (not the ommand)
goto :done

:docs
echo executing "%homedrive%%homepath%\Documents"
%homedrive%
cd "%homepath%\Documents"\test error\
if %errorlevel% neq 0 goto :error
goto :done

:error
echo Error: Input (%1 %2 %3 %4 %5 %6 %7 %8 %9) or command is invalid
echo go help for help
goto :done

:done

cd's /dgeçişinin bir nedeni var : cd /d "C:\Users\Me" (and the proper path delimeter for Windows is `` değil /).
Stephan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.