Cách thích hợp để kiểm tra nếu một tham số trống trong tệp bó?


211

Tôi cần kiểm tra xem một biến có được đặt hay không. Tôi đã thử một số kỹ thuật nhưng họ dường như không bất cứ khi nào %1được bao quanh bởi dấu ngoặc kép như trường hợp khi %1"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.

Theo trang web này , đây là các IFloại cú pháp được hỗ trợ . Vì vậy, tôi không thấy một cách để làm điều đó.

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

1
Trên các hệ thống của tôi (Windows 2003 cũng như Windows 7), if "%1" == "" GOTO MyLabelkhông giết chết nghiêm trọng việc thực thi tập lệnh miễn là %1có số lượng trích dẫn kép chẵn. Tôi thấy rằng một số lượng lớn các dấu ngoặc kép %1sẽ giết chết việc thực thi tập lệnh với lỗi này: The syntax of the command is incorrect.Giải pháp bên dưới sử dụng dấu ngoặc vuông để giải quyết vấn đề đã được đánh dấu là câu trả lời đúng nhưng dường như không làm gì tốt hơn . Giải pháp đó cũng thất bại với cùng một lỗi khi %1có số lượng dấu ngoặc kép lẻ.
Susam Pal

@SusamPal Thú vị. Hãy thử phiên bản dấu ngoặc đơn bên dưới nó và xem nếu nó hoạt động. Đó là một trong những tôi đã thử nghiệm nhiều hơn. Tôi vừa cập nhật câu trả lời được chấp nhận một vài ngày trước.
blak3r

Câu trả lời của Dan Story dường như hoạt động tốt. Tôi đã sử dụng phiên bản sử dụng dấu ngoặc vuông.
Susam Pal

một ví dụ "bắt tất cả" tốt: stackoverflow.com/questions/830565/ trên bao gồm cả tệp / thư mục và hỗn hợp chuỗi / số chung trong đối số.

Vì vậy, bực bội - IF DEFINEDchỉ làm việc trên các biến môi trường thay vì các biến script là một sự lãng phí tiềm năng!
kayleeFrye_onDeck

Câu trả lời:


289

Sử dụng dấu ngoặc vuông thay cho dấu ngoặc kép:

IF [%1] == [] GOTO MyLabel

Dấu ngoặc không an toàn : chỉ sử dụng dấu ngoặc vuông.


11
dấu ngoặc đơn không an toàn! Nội dung như &trong %1sẽ phá vỡ dòng
jeb

14
Sử dụng các ký tự khác như if #%1#==##hoặc if [%1]==[]là tốt miễn là không có khoảng trắng trong đối số, nếu không bạn sẽ gặp …was unexpected at this timelỗi.
Synetech

12
Và sử dụng "%~1"thực sự là một cách tiếp cận tốt hơn, như tôi đã đề cập trong câu trả lời của mình.
jamesdlin

8
Các bạn, @jamesdlin đúng. Cách tiếp cận này sẽ không hoạt động nếu văn bản biến có khoảng trắng hoặc là ==. Sử dụng câu trả lời của anh ấy để thay thế.
James Ko

4
Bạn không làm rõ điều đó it DOES NOT work with spaces. Sử dụng câu trả lời @jamesdlin thay thế.
JB. Với Monica.

152

Bạn có thể dùng:

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

để tước bộ trích dẫn bên ngoài. Nói chung, đây là một phương pháp đáng tin cậy hơn so với sử dụng dấu ngoặc vuông vì nó sẽ hoạt động ngay cả khi biến có khoảng trắng trong đó.


9
Đây thực sự là một cách tốt để làm điều đó. Bằng cách sử dụng ~, bạn loại bỏ các trích dẫn bên ngoài nếu chúng có mặt, nhưng sau đó thêm chúng lại bằng tay (đảm bảo chỉ có một bộ). Hơn nữa, bạn phải sử dụng dấu ngoặc kép nếu đối số chứa khoảng trắng (Tôi đã học được điều này một cách khó khăn khi phiên bản trước đó của tôi sử dụng #hoặc dấu ngoặc thay vì dấu ngoặc kép gây ra các khoảng trống để tạo …was unexpected at this timera lỗi.)
Synetech

4
điều này cũng có thể áp dụng cho các biến chung như% MYVAR% thay vì các đối số như% 1?
đơn giản

4
@simpleuser Rất tiếc, bạn nói đúng, nó không hoạt động với các biến môi trường chung.
jamesdlin

1
coi chừng các chuỗi sử dụng double '"' làm chuỗi thoát - tập lệnh sẽ bị sập khi thử so sánh. Ví dụ: ""this string will crash the comparison""Double '"' là chuỗi thoát thích hợp và thực hiện thay thế trên double '"' sẽ thất bại nếu chuỗi trống.
Tydaeus

1
@Amalgovinus Có lẽ bạn có thể chuyển biến dưới dạng đối số cho chương trình con và để chương trình con sử dụng "%~1".
jamesdlin

38

Một trong những giải pháp bán tốt nhất là sao chép %1vào một biến và sau đó sử dụng mở rộng bị trì hoãn, như delayExp. luôn an toàn trước mọi nội dung

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

Ưu điểm của việc này là giao dịch với param1 hoàn toàn an toàn.

Và cài đặt của param1 sẽ hoạt động trong nhiều trường hợp, như

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

Nhưng nó vẫn thất bại với nội dung lạ như

test.bat ^&"&

Để có thể có được câu trả lời đúng 100% cho sự tồn tại

Nó phát hiện nếu %1trống, nhưng đối với một số nội dung, nó không thể tìm nạp nội dung.
Điều này cũng có thể hữu ích để phân biệt giữa trống %1và một với "".
Nó sử dụng khả năng của CALLlệnh thất bại mà không hủy bỏ tệp bó.

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

Nếu bạn muốn có bằng chứng đạn 100% để tìm nạp nội dung, bạn có thể đọc Làm thế nào để nhận được các tham số dòng lệnh kỳ lạ nhất?


18

Từ IF /?:

Nếu tiện ích mở rộng lệnh được bật thì IF thay đổi như sau:

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

......

Điều kiện DEFINED hoạt động giống như EXISTS ngoại trừ nó lấy tên biến môi trường và trả về true nếu biến môi trường được xác định.


1
Vâng, tôi thực sự đã thử cách tiếp cận này và từ những gì tôi có thể nói điều này chỉ hoạt động với các biến ENVIRONMENT. Do đó, không hoạt động với% 1 hoặc một biến được xác định trong tệp bó.
blak3r

2
Điều đó chỉ đúng cho %1và thích. "Các biến được định nghĩa bên trong tệp bó" thực sự các biến môi trường trong khi tệp bó đang chạy và bạn có thể sử dụng IF DEFINEDchúng.
zb226

8

Thật không may, tôi không có đủ danh tiếng để bình luận hoặc bỏ phiếu cho các câu trả lời hiện tại mà tôi đã phải tự viết.

Ban đầu câu hỏi của OP cho biết "biến" chứ không phải "tham số", điều này rất khó hiểu, đặc biệt vì đây là liên kết số một trong google để tìm kiếm cách kiểm tra các biến trống. Vì câu trả lời ban đầu của tôi, Stephan đã chỉnh sửa câu hỏi ban đầu để sử dụng thuật ngữ chính xác, nhưng thay vì xóa câu trả lời của tôi, tôi quyết định bỏ nó để giúp xóa mọi nhầm lẫn, đặc biệt là trong trường hợp google vẫn gửi cho mọi người ở đây các biến:

% 1 KHÔNG PHẢI LÀ MỘT BIẾN! NÓ LÀ MỘT PARAMETER LINE LINE.

Phân biệt rất quan trọng. Một dấu phần trăm duy nhất với một số sau nó tham chiếu đến một tham số dòng lệnh không phải là một biến.

Các biến được đặt bằng lệnh set và được gọi lại bằng 2 phần trăm - một trước và một sau. Ví dụ% myvar%

Để kiểm tra biến rỗng, bạn sử dụng cú pháp "nếu không được xác định" (các lệnh rõ ràng cho các biến không yêu cầu bất kỳ dấu phần trăm nào), ví dụ:

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.

(Nếu bạn muốn kiểm tra các tham số dòng lệnh thì tôi khuyên bạn nên tham khảo câu trả lời của jamesdlin.)


1
bạn đúng rồi. Nhưng cách chính xác sẽ là chỉ sửa tiêu đề từ if variable is emptyđến if parameter is empty. Tôi vừa làm nó. (có nguy cơ làm mất hiệu lực một số câu trả lời, đã kiểm tra các biến thay vì tham số và vì vậy dù sao cũng không hợp lệ, vì họ không trả lời câu hỏi)
Stephan

1
OK cảm ơn Stephan, đã không nhận ra bạn có thể làm điều đó. Tôi đã chỉnh sửa câu trả lời của mình để phản ánh cập nhật.
AutoMattTick

6

Sử dụng "IF DEFINED biến biến" để kiểm tra biến trong tệp bó.

Nhưng nếu bạn muốn kiểm tra các tham số lô, hãy thử các mã bên dưới để tránh đầu vào khó khăn (chẳng hạn như "1 2" hoặc ab ^> cd)

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

5

Tôi kiểm tra với mã dưới đây và nó là tốt.

@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
)

Giải pháp của bạn thất bại khi biến chứa một trích dẫn. Btw tồn tại cú pháp IF DEFINED varvì một lý do
jeb

4

Tôi thường sử dụng cái này:

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

Nếu% 1 trống, IF sẽ so sánh "." đến "." Mà sẽ đánh giá là đúng.


4
Điều này là không đúng. Đây là điều tương tự như: NẾU "% 1" == "" lý do cho bài đăng này là nếu bản thân% 1 có trích dẫn này không thành công.
blak3r

Bạn đang cố kiểm tra xem% 1 có trống không hay nó có dấu ngoặc kép không? Câu hỏi không rõ ràng. Câu trả lời của tôi hoạt động nếu không có gì được chỉ định trên dòng lệnh cho% 1.
aphoria

> Bạn đang cố kiểm tra xem% 1 có trống không hoặc nếu nó có dấu ngoặc kép? @aphoria, nó phải có khả năng xử lý cả hai.
Synetech

Tôi đã sử dụng điều này để giải quyết nếu% 1% đã được đặt, hoạt động tốt cho tôi. Cảm ơn, câu trả lời tốt!
Charlie A

4

Tôi đã tạo tập lệnh bó nhỏ này dựa trên các câu trả lời ở đây, vì có nhiều kịch bản hợp lệ. Vui lòng thêm vào điều này miễn là bạn theo cùng một định dạng:

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

Chuỗi rỗng là một cặp double-quotes/ "", chúng ta chỉ có thể kiểm tra độ dài:

set ARG=%1
if not defined ARG goto nomore

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

sau đó kiểm tra 2 ký tự chống lại double-quotes:

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

Đây là một tập lệnh bó mà bạn có thể chơi với. Tôi nghĩ rằng nó bắt đúng chuỗi trống.

Đây chỉ là một ví dụ, bạn chỉ cần tùy chỉnh 2 (hoặc 3?) Ở trên theo kịch bản của bạn.

@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

Kết quả kiểm tra tra tấn này:

.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" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""

Thật sai lầm, một chuỗi rỗng không phải là một chuỗi có hai dấu ngoặc kép, ""một chuỗi rỗng là một chuỗi rỗng `` và trong lô, một biến rỗng là một biến không xác định. Bạn có thể xác định rằng đối với các đối số của bạn, các trích dẫn bên ngoài sẽ bị xóa, nhưng sau đó chuỗi vẫn trống với độ dài 0
jeb

Trong ngữ cảnh này (các đối số win cmd), bạn không thể biểu thị một chuỗi rỗng với bất kỳ cách nào khác, ngay cả với trích dẫn đơn kép mà trống như nhau dưới vỏ unix.
dùng6801759

Có, ""cũng được sử dụng cho các chuỗi trống, nhưng nó khá dễ sử dụng %~1để loại bỏ các trích dẫn bên ngoài. không có nhu cầu sử dụng một giải pháp phức tạp như vậy
Jeb

Bạn nói đúng, tôi có thể tuyên bố không chính xác, nó không chỉ cho chuỗi rỗng mà là một cách an toàn để liệt kê các đối số. Các cách khác như "%~1"==""sẽ thất bại với đối số như "Long File Name".txtđối số hợp lệ. chỉnh sửa : Và nó chắc chắn không phức tạp như bạn nói. Chỉ có 2 bước ở trên để kiểm tra, phần còn lại là ví dụ dài dòng.
dùng6801759

"Nếu không được xác định ARG" dường như hoạt động hoàn hảo (biến của tôi không xuất phát từ dòng lệnh)
GrayFace


3

Kịch bản 1:

Đầu vào ("Xóa dấu ngoặc kép.cmd" "Đây là bản thử nghiệm")

@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

Đầu ra (Không có gì,% 1 KHÔNG trống, trống hoặc NULL):


Chạy ("Xóa Báo giá.cmd") mà không có bất kỳ tham số nào với tập lệnh trên 1

Đầu ra (% 1 trống, trống hoặc NULL):

Welcome!

Press any key to continue . . .

Lưu ý: Nếu bạn đặt một biến trong một IF ( ) ELSE ( ) câu lệnh, nó sẽ không có sẵn để DEFINED cho đến khi nó thoát khỏi câu lệnh "IF" (trừ khi "Mở rộng biến đổi bị trì hoãn" được bật; một khi được bật, hãy sử dụng dấu chấm than "!" Thay cho dấu chấm than "!" biểu tượng phần trăm "%"}.

Ví dụ:

Kịch bản 2:

Đầu vào ("Xóa dấu ngoặc kép.cmd" "Đây là bản thử nghiệm")

@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

Đầu ra:

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>  

Lưu ý: Nó cũng sẽ xóa dấu ngoặc kép từ bên trong chuỗi.

Ví dụ: (sử dụng tập lệnh 1 hoặc 2): C: \ Users \ Test \ Documents \ Batch Files> "Xóa dấu ngoặc kép.cmd" "Đây là" một "Thử nghiệm"

Đầu ra (Kịch bản 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  

Thực thi ("Xóa dấu ngoặc kép.cmd") mà không có bất kỳ tham số nào trong Tập lệnh 2:

Đầu ra:

Welcome!

Press any key to continue . . .

3

Để tổng hợp mọi thứ:

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

Mã này sẽ xuất ra "Chuỗi rỗng" nếu% 1 là "" hoặc "hoặc trống. Đã thêm nó vào câu trả lời được chấp nhận hiện không chính xác.


0

Tôi đã có rất nhiều vấn đề với rất nhiều câu trả lời trên mạng. Hầu hết làm việc cho hầu hết mọi thứ, nhưng luôn luôn có một trường hợp góc phá vỡ từng cái.
Có thể nó không hoạt động nếu nó có dấu ngoặc kép, có thể nó bị hỏng nếu nó không có dấu ngoặc kép, lỗi cú pháp nếu var có khoảng trắng, một số sẽ chỉ hoạt động trên các tham số (trái ngược với các biến môi trường), các kỹ thuật khác cho phép trống tập hợp các trích dẫn để vượt qua như 'được xác định' và một số trích dẫn khó hơn sẽ không cho phép bạn xâu chuỗielse sau đó.

Đây là một giải pháp tôi hài lòng, xin vui lòng cho tôi biết nếu bạn tìm thấy một trường hợp góc mà nó không hoạt động.

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

Có chương trình con đó trong một kịch bản của bạn, hoặc trong chính nó .bat, sẽ hoạt động.
Vì vậy, nếu bạn muốn viết (bằng giả):

if (var)
then something
else somethingElse

Bạn có thể viết:

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

Nó hoạt động cho tất cả các bài kiểm tra của tôi:

(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


Ví dụ khác:

  • Muốn kiểm tra ifkhông?Call :ifSet %var% && Echo set
  • Chỉ nếu không (chỉ khác)? Call :ifSet %var% || Echo set
  • Kiểm tra một đối số đã thông qua; hoạt động tốtCall :ifSet %1 && Echo set
  • Bạn không muốn làm tắc nghẽn các tập lệnh / mã dupe của mình, vì vậy bạn đặt nó trong tập lệnh của riêng mình ifSet.bat? Không vấn đề gì:((Call ifSet.bat %var%) && Echo set) || (Echo not set)

Tìm thấy một trường hợp; Nếu bạn thử cú pháp (Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echotrue false
if with other

Trên thực tế, nếu đây là một vấn đề và bạn có thể xử lý một dòng bổ sung, bạn có thể giảm thiểu điều này bằng cách tự gọi ifSet, sau đó sử dụngIf %errorlevel% EQU 0 (x) Else (y)
Hashbrown

Những trường hợp nào câu trả lời được chấp nhận (sử dụng dấu ngoặc vuông) không hoạt động? Và bạn có thể giải thích những gì Lối ra / B làm
blak3r

vì một số lý do khi tôi kiểm tra nó đã bị hỏng khi sử dụng setcác biến (như [%bob%], chỉ hoạt động cho các đối số như [%2]) nhưng bây giờ kiểm tra lại nó hoạt động. Tôi đoán []sự
kìm kẹp

Các /Bcờ dừng lại toàn bộ lô hàng từ thoát, chỉ thoát khỏi chương trình con hoặc call'd hàng loạt. Trừ khi bạn hỏi toàn bộ lệnh đang làm gì; nó trả về mã lỗi để cho tập lệnh gọi biết kết quả của chương trình con ( 0vượt qua, 1thất bại), có thể sử dụng thông qua logic boolean trong câu trả lời hoặc thông qua%errorlevel% các nhận xét trên
Hashbrown

0

Sử dụng! thay vì "để kiểm tra chuỗi rỗng

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

1
Mẹo thực sự là xấu. Trích dẫn có thể xử lý ít nhất khoảng trắng và ký tự đặc biệt, nhưng dấu chấm than thì không thể. Và dấu chấm than trở nên thực sự khó chịu ở đây khi kích hoạt mở rộng bị trì hoãn
jeb

0

Tôi mới vào được chưa đầy một tháng tuổi (mặc dù đã được hỏi 8 năm trước) ... Tôi hy vọng bây giờ anh ấy đã vượt ra ngoài các tập tin hàng loạt. ;-) Tôi đã từng làm điều này mọi lúc. Tôi không chắc mục tiêu cuối cùng là gì. Nếu anh ấy lười biếng như tôi, go.bat của tôi hoạt động cho những thứ như thế. (Xem bên dưới) Nhưng, 1, lệnh trong OP có thể không hợp lệ nếu bạn trực tiếp sử dụng đầu vào làm lệnh. I E,

"C:/Users/Me"

là một lệnh không hợp lệ (hoặc được sử dụng nếu bạn ở trên một ổ đĩa khác). Bạn cần phải chia nó thành hai phần.

C:
cd /Users/Me

Và, 2, 'định nghĩa' hoặc 'không xác định' nghĩa là gì? GIGO. Tôi sử dụng mặc định để bắt lỗi. Nếu đầu vào không bị bắt, nó sẽ giảm xuống để trợ giúp (hoặc một lệnh mặc định). Vì vậy, không có đầu vào không phải là một lỗi. Bạn có thể thử cd vào đầu vào và bắt lỗi nếu có. (Ok, sử dụng go "tải xuống (chỉ một paren) bị bắt bởi DOS. (Harsh!))

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

Và, 3, trích dẫn chỉ cần thiết xung quanh đường dẫn, không phải lệnh. I E,

"cd C:\Users" 

là xấu (hoặc được sử dụng cho ngày xưa) trừ khi bạn đang ở trên một ổ đĩa khác.

cd "\Users" 

là chức năng.

cd "\Users\Dr Whos infinite storage space"

hoạt động nếu bạn có không gian trong đường dẫn của bạn.

@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

có một lý do cho cd's /dswitch: cd /d "C:\Users\Me" (and the proper path delimeter for Windows is `, không /).
Stephan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.