Apa cara yang tepat untuk menguji apakah suatu parameter kosong dalam file batch?

213

Saya perlu menguji apakah suatu variabel disetel atau tidak. Saya sudah mencoba beberapa teknik tetapi mereka tampaknya gagal setiap kali %1dikelilingi oleh tanda kutip seperti kasus ketika %1adalah "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.

Menurut situs ini , ini adalah IFjenis sintaks yang didukung . Jadi, saya tidak melihat cara untuk melakukannya.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
blak3r
sumber
1
Di sistem saya (Windows 2003 dan juga Windows 7), if "%1" == "" GOTO MyLabeltidak mematikan eksekusi skrip selama %1memiliki jumlah genap dari tanda kutip ganda. Saya melihat bahwa jumlah ganjil dari tanda kutip ganda dalam %1membunuh eksekusi skrip dengan kesalahan ini: The syntax of the command is incorrect.Solusi di bawah ini yang menggunakan tanda kurung siku untuk menyelesaikan masalah telah ditandai sebagai jawaban yang benar tetapi sepertinya tidak ada yang lebih baik . Solusi itu juga gagal dengan kesalahan yang sama ketika %1memiliki jumlah tanda kutip ganda ganjil.
Susam Pal
@SusamPal Menarik. Coba versi kurung di bawahnya dan lihat apakah itu berhasil. Yang saya uji lagi. Saya baru saja memperbarui jawaban yang diterima beberapa hari yang lalu.
blak3r
Jawaban Dan Story sepertinya bekerja dengan baik. Saya menggunakan versi menggunakan tanda kurung siku.
Susam Pal
contoh "catch all" yang bagus: stackoverflow.com/questions/830565/… yang mencakup file / direktori dan campuran string / angka generik dalam argumen.
Sangat frustasi - IF DEFINEDhanya mengerjakan variabel lingkungan dan bukan variabel skrip adalah pemborosan!
kayleeFrye_onDeck

Jawaban:

290

Gunakan tanda kurung kotak alih-alih tanda kutip:

IF [%1] == [] GOTO MyLabel

Kurung tidak aman : hanya gunakan kurung kotak.

Dan Story
sumber
11
tanda kurung tidak aman! Konten seperti &in %1akan memutus garis
jeb
14
Menggunakan karakter lain suka if #%1#==##atau if [%1]==[]baik selama tidak ada spasi dalam argumen, jika tidak, Anda akan mendapatkan …was unexpected at this timekesalahan.
Synetech
12
Dan menggunakan "%~1"benar-benar pendekatan yang lebih baik, seperti yang saya sebutkan dalam jawaban saya.
jamesdlin
8
Kawan, @jamesdlin benar. Pendekatan ini tidak akan berfungsi jika teks variabel memiliki spasi atau ==. Gunakan jawabannya sebagai gantinya.
James Ko
4
Anda tidak menjelaskannya it DOES NOT work with spaces. Gunakan jawaban @jamesdlin sebagai gantinya.
JB. Dengan Monica.
153

Kamu bisa memakai:

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

untuk menghapus set kutipan. Secara umum, ini adalah metode yang lebih andal daripada menggunakan tanda kurung siku karena itu akan bekerja bahkan jika variabel memiliki spasi di dalamnya.

jamesdlin
sumber
9
Ini memang cara yang baik untuk melakukannya. Dengan menggunakan ~, Anda menghapus tanda kutip luar jika ada, tetapi kemudian menambahkannya kembali secara manual (memastikan hanya satu set). Selain itu, Anda harus menggunakan tanda kutip jika argumen berisi spasi (saya belajar ini dengan cara yang sulit ketika versi saya sebelumnya menggunakan #atau tanda kurung alih-alih tanda kutip menyebabkan argumen dengan spasi untuk membuat …was unexpected at this timekesalahan.)
Synetech
4
apakah ini juga berlaku untuk variabel umum seperti% MYVAR% daripada argumen seperti% 1?
simpleuser
4
@simpleuser Ups, Anda benar, itu tidak berfungsi dengan variabel lingkungan umum.
jamesdlin
1
perhatikan string yang menggunakan dobel '"' sebagai urutan pelarian - skrip akan macet saat mencoba perbandingan. Misalnya ""this string will crash the comparison"". Dobel '"' adalah urutan pelarian yang tepat, dan melakukan penggantian pada dobel '"' akan gagal jika string kosong
Tydaeus
1
@Amalgovinus Anda mungkin bisa melewatkan variabel sebagai argumen ke subrutin dan membiarkan penggunaan subrutin "%~1".
jamesdlin
38

Salah satu solusi semi terbaik adalah menyalin %1ke dalam variabel dan kemudian menggunakan ekspansi tertunda, sebagai delayExp. selalu aman terhadap konten apa pun.

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

Keuntungan dari hal ini adalah berurusan dengan param1 benar-benar aman.

Dan pengaturan param1 akan berfungsi dalam banyak kasus, seperti

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

Tetapi masih gagal dengan konten aneh seperti

test.bat ^&"&

Untuk bisa mendapatkan jawaban yang benar 100% untuk keberadaannya

Mendeteksi jika %1kosong, tetapi untuk beberapa konten tidak dapat mengambil konten.
Ini juga bisa berguna untuk membedakan antara yang kosong %1dan yang satu "".
Ia menggunakan kemampuan CALLperintah untuk gagal tanpa membatalkan file batch.

@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!'

Jika Anda ingin 100% bullet proof untuk mengambil konten, Anda bisa membaca Bagaimana cara menerima parameter baris perintah yang paling aneh sekalipun?

jeb
sumber
18

Dari IF / ?:

Jika Ekstensi Perintah diaktifkan, JIKA berubah sebagai berikut:

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

......

Conditional DEFINED bekerja seperti halnya EXISTS kecuali itu mengambil nama variabel lingkungan dan mengembalikan true jika variabel lingkungan didefinisikan.

Andy Morris
sumber
1
Ya, saya benar-benar mencoba pendekatan ini dan dari apa yang saya tahu ini hanya berfungsi dengan variabel LINGKUNGAN. Oleh karena itu, tidak berfungsi dengan% 1 atau variabel yang ditentukan di dalam file batch.
blak3r
2
Itu hanya berlaku untuk %1dan suka. "Variabel yang ditentukan di dalam file batch" sebenarnya adalah variabel lingkungan saat file batch sedang berjalan, dan Anda dapat menggunakannya IF DEFINED.
zb226
8

Sayangnya saya tidak memiliki reputasi yang cukup untuk berkomentar atau memilih jawaban saat ini untuk saya harus menulis sendiri.

Awalnya pertanyaan OP mengatakan "variabel" daripada "parameter", yang menjadi sangat membingungkan, terutama karena ini adalah tautan nomor satu di google untuk mencari cara menguji variabel kosong. Sejak jawaban asli saya, Stephan telah mengedit pertanyaan asli untuk menggunakan terminologi yang benar, tetapi daripada menghapus jawaban saya, saya memutuskan untuk meninggalkannya untuk membantu menjernihkan kebingungan, terutama jika google masih mengirim orang ke sini untuk variabel juga:

% 1 BUKAN AYAH ITU ADALAH PARAMETER LINE PERINTAH.

Perbedaan yang sangat penting. Tanda persen tunggal dengan angka setelah itu merujuk ke parameter baris perintah bukan variabel.

Variabel diatur menggunakan perintah set, dan dipanggil kembali menggunakan tanda 2 persen - satu sebelum dan satu sesudah. Misalnya% myvar%

Untuk menguji variabel kosong, Anda menggunakan sintaks "jika tidak didefinisikan" (perintah secara eksplisit untuk variabel tidak memerlukan tanda persen), misalnya:

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.

(Jika Anda ingin menguji parameter baris perintah maka saya sarankan merujuk pada jawaban jamesdlin.)

AutoMattTick
sumber
1
kamu benar. Tetapi cara yang benar adalah dengan hanya memperbaiki judul dari if variable is emptyke if parameter is empty. Saya baru melakukannya. (dengan risiko membatalkan beberapa jawaban, yang memang memeriksa variabel alih-alih parameter dan juga tidak valid, karena mereka tidak menjawab pertanyaan)
Stephan
1
OK terima kasih Stephan, tidak sadar kamu bisa melakukan itu. Saya telah mengedit jawaban saya untuk mencerminkan pembaruan.
AutoMattTick
6

Gunakan "JIKA perintah variabel DEFINED" untuk menguji variabel dalam file batch.

Tetapi jika Anda ingin menguji parameter batch, coba kode di bawah ini untuk menghindari input yang rumit (seperti "1 2" atau ab ^> cd)

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

Saya menguji dengan kode di bawah ini dan itu baik-baik saja.

@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
)
Kate
sumber
Solusi Anda gagal saat variabel berisi kutipan. Btw ada sintaksis IF DEFINED varkarena suatu alasan
jeb
4

Saya biasanya menggunakan ini:

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

Jika% 1 kosong, IF akan membandingkan "." ke "." yang akan mengevaluasi benar.

kata mutiara
sumber
4
Ini salah. Ini adalah hal yang sama dengan: JIKA "% 1" == "" alasan untuk posting ini adalah jika% 1 sendiri memiliki kutipan ini gagal.
blak3r
Apakah Anda mencoba menguji apakah% 1 kosong atau memiliki tanda kutip? Pertanyaannya tidak jelas. Jawaban saya berfungsi jika tidak ada yang ditentukan pada baris perintah untuk% 1.
aphoria
> Apakah Anda mencoba menguji apakah% 1 kosong atau jika ada tanda kutip? @aphoria, itu harus bisa menangani keduanya.
Synetech
Saya menggunakan ini untuk bekerja jika% 1% telah ditetapkan, bekerja dengan baik untuk saya. Terima kasih, jawaban yang bagus!
Charlie A
4

Saya membuat skrip kumpulan kecil ini berdasarkan jawaban di sini, karena ada banyak yang valid. Jangan ragu untuk menambahkan ini selama Anda mengikuti format yang sama:

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
kayleeFrye_onDeck
sumber
4

String kosong adalah sepasang double-quotes/ "", kita bisa menguji panjangnya:

set ARG=%1
if not defined ARG goto nomore

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

kemudian uji 2 karakter terhadap double-quotes:

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

Inilah skrip kumpulan yang dapat Anda mainkan. Saya pikir itu benar menangkap string kosong.

Ini hanya contoh, Anda hanya perlu menyesuaikan 2 (atau 3?) Langkah-langkah di atas sesuai dengan skrip Anda.

@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

Hasil tes penyiksaan ini:

.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" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
pengguna6801759
sumber
Itu salah, string kosong bukanlah string dengan dua tanda kutip ganda ""string kosong adalah string kosong `` dan dalam batch variabel kosong adalah variabel yang tidak ditentukan. Anda dapat menentukan, bahwa untuk argumen Anda, tanda kutip luar akan dihapus, tetapi kemudian senarnya masih kosong dengan panjang 0
jeb
Dalam konteks ini (win cmd argumen), Anda tidak dapat menunjukkan string kosong dengan cara lain, bahkan dengan kutipan tunggal ganda yang sama-sama kosong di bawah shell unix.
user6801759
Ya, ""digunakan untuk string kosong juga, tetapi cukup mudah digunakan %~1untuk menghapus tanda kutip luar. tidak perlu menggunakan solusi yang kompleks
jeb
Anda benar, saya mungkin menyatakan dengan tidak tepat, itu bukan hanya untuk string kosong tetapi cara yang aman untuk menyebutkan argumen. Cara lain seperti "%~1"==""akan gagal dengan argumen seperti "Long File Name".txtmana yang merupakan argumen yang valid. sunting : Dan itu jelas tidak rumit seperti yang Anda katakan. Hanya 2 langkah di atas untuk pengujian, sisanya adalah contoh verbose.
user6801759
"jika tidak didefinisikan ARG" tampaknya berfungsi dengan baik (variabel saya tidak berasal dari baris perintah)
GrayFace
3

Skrip 1:

Input ("Hapus Quotes.cmd" "Ini Uji")

@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

Output (Tidak ada,% 1 TIDAK kosong, kosong, atau NULL):


Jalankan ("Hapus Quotes.cmd") tanpa parameter apa pun dengan skrip di atas 1

Output (% 1 kosong, kosong, atau NULL):

Welcome!

Press any key to continue . . .

Catatan: Jika Anda mengatur variabel di dalam sebuah IF ( ) ELSE ( ) pernyataan, itu tidak akan tersedia untuk DITETAPKAN sampai setelah itu keluar dari pernyataan "JIKA" (kecuali "Ekspansi Variabel Tertunda" diaktifkan; setelah diaktifkan gunakan tanda seru "!" Sebagai ganti variabel simbol persen "%"}.

Sebagai contoh:

Skrip 2:

Input ("Hapus Quotes.cmd" "Ini Uji")

@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

Keluaran:

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>  

Catatan: Ini juga akan menghapus tanda kutip dari dalam string.

Sebagai Contoh (menggunakan skrip 1 atau 2): C: \ Users \ Test \ Documents \ Batch Files> "Remove Quotes.cmd" "Ini adalah" a "Test"

Output (Script 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  

Jalankan ("Hapus Quotes.cmd") tanpa parameter apa pun di Skrip 2:

Keluaran:

Welcome!

Press any key to continue . . .
Pak Rick
sumber
3

Singkatnya:

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

Kode ini akan menampilkan "string kosong" jika% 1 salah "" atau "atau kosong. Menambahkannya ke jawaban yang diterima yang saat ini salah.

GrayFace
sumber
0

Saya punya banyak masalah dengan banyak jawaban di internet. Sebagian besar bekerja untuk sebagian besar hal, tetapi selalu ada sudut yang memecah masing-masing.
Mungkin tidak berfungsi jika mendapat tanda kutip, mungkin rusak jika tidak memiliki tanda kutip, kesalahan sintaks jika var memiliki spasi, beberapa hanya akan bekerja pada parameter (sebagai lawan variabel lingkungan), teknik lain memungkinkan kosong set tanda kutip untuk lulus sebagai 'didefinisikan', dan beberapa yang lebih rumit tidak akan membiarkan Anda rantai elsesetelahnya.

Inilah solusi yang saya senangi, tolong beri tahu saya jika Anda menemukan kasing sudut yang tidak berhasil.

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

Memiliki subrutin itu baik dalam skrip Anda, atau dalam skrip itu sendiri .bat, harus bekerja.
Jadi jika Anda ingin menulis (dalam pseudo):

if (var)
then something
else somethingElse

Kamu bisa menulis:

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

Ini berhasil untuk semua tes saya:

(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

Echo'd n, y, n,y ,y


Lebih banyak contoh:

  • Mau periksa saja if ?Call :ifSet %var% && Echo set
  • Hanya jika tidak (hanya yang lain)? Call :ifSet %var% || Echo set
  • Memeriksa argumen yang lolos; bekerja dengan baik.Call :ifSet %1 && Echo set
  • Tidak ingin menyumbat kode skrip / dupe Anda, jadi Anda memasukkannya sendiri ifSet.bat? Tidak masalah:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
Hashbrown
sumber
Menemukan sebuah kasus; Jika Anda mencoba sintaks if with else, dan perintah terakhir di blok then gagal, maka yang lain akan menjalankan (Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo:, echos true and false
Hashbrown
Sebenarnya, jika ini merupakan masalah, dan Anda dapat menangani jalur tambahan, Anda dapat mengurangi ini dengan memanggilnya ifSetsendiri, kemudian menggunakanIf %errorlevel% EQU 0 (x) Else (y)
Hashbrown
Kasing apa yang tidak diterima jawaban (gunakan kurung siku)? Dan bisakah Anda menjelaskan apa yang dilakukan Exit / B
blak3r
untuk beberapa alasan ketika saya mengujinya rusak ketika menggunakan setvariabel (seperti [%bob%], hanya berfungsi untuk argumen seperti [%2]) tapi sekarang periksa kembali berfungsi. Saya kira satu-satunya keluhan saya []sekarang adalah membiarkan tanda kutip kosong lewat, sedangkan ini tidak akan terjadi (jadi terserah Anda gunakan, sungguh)
Hashbrown
The /Bbendera berhenti seluruh batch dari keluar, hanya keluar subroutine atau call'd batch. Kecuali jika Anda bertanya apa yang dilakukan seluruh perintah ; itu mengembalikan kode kesalahan untuk membiarkan skrip panggilan mengetahui hasil subrutin ( 0lulus, 1gagal), dapat digunakan melalui logika boolean dalam jawabannya, atau melalui %errorlevel%dalam komentar di atas
Hashbrown
0

Menggunakan! bukannya "untuk memeriksa string kosong

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty
Lin W
sumber
1
Tipnya sangat buruk. Kutipan dapat menangani spasi dan karakter khusus setidaknya, tetapi tanda seru tidak bisa. Dan tanda seru menjadi sangat buruk di sini ketika ekspansi yang tertunda diaktifkan
jeb
0

Saya masuk hanya di bawah satu bulan (meskipun ditanya 8 tahun yang lalu) ... Saya harap dia sudah pindah file batch sekarang. ;-) Saya biasa melakukan ini setiap saat. Saya tidak yakin apa tujuan akhirnya. Jika dia malas seperti saya, go.bat saya bekerja untuk hal-hal seperti itu. (Lihat di bawah) Tapi, 1, perintah di OP bisa tidak valid jika Anda langsung menggunakan input sebagai perintah. yaitu,

"C:/Users/Me"

adalah perintah yang tidak valid (atau dulu jika Anda berada di drive yang berbeda). Anda perlu memecahnya menjadi dua bagian.

C:
cd /Users/Me

Dan, 2, apa artinya 'terdefinisi' atau 'tidak terdefinisi'? GIGO. Saya menggunakan default untuk menangkap kesalahan. Jika input tidak tertangkap, ia turun untuk membantu (atau perintah default). Jadi, tidak ada input bukan kesalahan. Anda dapat mencoba untuk memasukkan input dan menangkap kesalahan jika ada. (Oke, menggunakan go "unduhan (hanya satu paren) ditangkap oleh DOS. (Harsh!))

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

Dan, 3, kutipan hanya dibutuhkan di sekitar jalan, bukan perintah. yaitu,

"cd C:\Users" 

buruk (atau dulu di masa lalu) kecuali Anda berada di drive yang berbeda.

cd "\Users" 

fungsional.

cd "\Users\Dr Whos infinite storage space"

berfungsi jika Anda memiliki ruang di jalur Anda.

@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
Xorange
sumber
ada alasan untuk cd's /dswitch: cd /d "C:\Users\Me" (and the proper path delimeter for Windows is `, tidak /).
Stephan