Các tính năng ẩn của tệp bó Windows


232

Một số tính năng ít biết, nhưng quan trọng và hữu ích của các tệp bó Windows là gì?

Hướng dẫn:

  • Một tính năng cho mỗi câu trả lời
  • Cung cấp cả mô tả ngắn về tính năng và ví dụ , không chỉ là liên kết đến tài liệu
  • Giới hạn câu trả lời cho tính tự nhiên bản địa , nghĩa là không yêu cầu phần mềm bổ sung, như Bộ tài nguyên Windows

Làm rõ: Chúng tôi đề cập ở đây các tập lệnh được xử lý bởi cmd.exe, đây là mặc định trên các biến thể WinNT.

(Xem thêm: Các tệp bó của Windows: .bat so với .cmd? )

Câu trả lời:


185

Tiếp tục dòng:

call C:\WINDOWS\system32\ntbackup.exe ^
    backup ^
    /V:yes ^
    /R:no ^
    /RS:no ^
    /HC:off ^
    /M normal ^
    /L:s ^
    @daily.bks ^
    /F daily.bkf

2
Tôi đã tìm kiếm điều này tuần trước! (không thể nhớ nhân vật)
chilltemp

21
^ Thực sự là một trích dẫn char. Sử dụng nó, bạn có thể trích dẫn <và> để chúng không chuyển hướng đầu ra. ^ Ở cuối dòng cũng cho phép tiếp tục dòng.
Cheeso

Bạn có thể vui lòng giải thích kịch bản nhỏ này?
guerda

2
@furtelwart: Điều này giống như khi bạn viết tất cả thành một dòng duy nhất : call C:\WINDOWS\system32\ntbackup.exe backup /V:yes /R:no /RS:no /HC:off /M normal /L:s @daily.bks /F daily.bkf. Và để hiểu tất cả các tham số của dòng đó, chỉ cần chạy C:\WINDOWS\system32\ntbackup.exe /?.
Kurt Pfeifle

Cuộc thảo luận chuyên sâu về chủ đề này, tại các lệnh dài chia thành nhiều dòng
jeb 17/03/2016

150
PUSHD path

Đưa bạn đến thư mục được chỉ định bởi đường dẫn .

POPD

Đưa bạn trở lại thư mục mà bạn "đẩy" từ.


5
Điều này cũng hoạt động như một ngăn xếp đầy đủ, vì vậy bạn có thể đẩy nhiều thư mục lên ngăn xếp, và sau đó tiếp tục bật để lấy lại vị trí của bạn.
Kibbee

Nghiêm túc? Làm thế nào tôi chưa bao giờ nghe nói về tính năng này trước đây?!
Josh Hinman

4
Chạy 'cmd.exe', sau đó nhập 'trợ giúp', sau đó nhập 'trợ giúp' hoặc 'đẩy /?'.
paxdiablo

86
Nếu bạn đẩy vào đường dẫn UNC, nó sẽ tự động ánh xạ ổ đĩa cho bạn và popd sẽ hủy sơ đồ đó.
Ferruccio

2
+1 đặc biệt đối với khả năng của UNC, bạn nên thêm câu đó vào câu trả lời của mình.
Adam Mitz

109

Không chắc chắn cách hữu ích này sẽ được trong một loạt tập tin, nhưng đó là một lệnh rất thuận tiện để sử dụng trong command prompt:

C:\some_directory> start .

Điều này sẽ mở Windows Explorer trong thư mục "some_directory".

Tôi đã tìm thấy điều này một tiết kiệm thời gian tuyệt vời.


1
tốt, tôi cũng sử dụng nó Tôi có tệp "open.cmd" trong một trong các thư mục PATH và điều duy nhất trong tệp đó là "@start." ;)
Paulius

5
'explorer' cũng thực hiện tương tự như 'start' C: \ some_directory> explorer.
Ray

1
Tôi có xu hướng gõ cái này là [bắt đầu "". ] (dấu ngoặc cho rõ ràng) bởi vì bắt đầu đôi khi rất khó hiểu về thông số đầu tiên là một tiêu đề.
hệ thống PAUSE

1
Nếu bạn tình cờ ở trên máy Mac, hãy open .làm điều tương tự.
Cấp cho Paul

1
startkhông cách nào hơn là chỉ mở thư mục hiện tại. Bạn có thể truyền cho nó bất kỳ tập tin nào và nó sẽ mở nó với trình xem được cấu hình. Cung cấp cho nó một URL và trình duyệt mặc định của bạn sẽ mở ra, v.v ...
idbrii

87

Tôi luôn cảm thấy khó đọc các bình luận được đánh dấu bởi một từ khóa trên mỗi dòng:

REM blah blah blah

Dễ đọc hơn:

:: blah blah blah

8
Tôi nghe nói :: hiệu quả hơn REM vì REM cố gắng mở rộng biến môi trường trên những thứ xảy ra sau nó, nhưng :: thì không.
Scott Langham

47
Trên thực tế, :: chỉ là một nhãn hiệu với một cái tên ngộ nghĩnh; Do đó, :: sẽ không hoạt động nếu bạn sử dụng nó trong một khối (trong ngoặc đơn) vì nhãn cũng không được phép ở đó. REM hoạt động ở đó tất nhiên.
mihi

Lưu ý rằng đó remlà một từ khóa tài liệu trong khi ::chỉ là một chi tiết thực hiện. Mặc dù không thể ::ngừng hoạt động nhưng nói chung không nên dựa vào hành vi không có giấy tờ.
Joey

Bạn thậm chí có thể sử dụng goto :để nhảy đến nhãn. :-)goto -)cũng sẽ làm việc
Sven Marnach

79

Biến đổi con:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456

3
Xấu xí, nhưng vô dụng!
guerda

1
@furtelwart Âm thanh như thế có thể là phương châm hàng loạt
rzrgenesys187

điều này thật tuyệt vời để định dạng ngày (tuy nhiên vấn đề tôi tìm thấy là vista / 7 và xp xuất ra NGÀY khác nhau)
Daniel

Lưu ý rằng thật không may, điều này không thể được kết hợp với các biến cục bộ của các vòng lặp FOR ( for %a in ...) vì chúng không yêu cầu dấu phần trăm đóng như các biến môi trường; trước tiên bạn phải gán chúng cho một biến môi trường (sử dụng mở rộng bị trì hoãn!) và sau đó trích xuất một chuỗi con.
RolKau

Đây là một điều xấu xí không thể tránh khỏi nếu bạn muốn làm gì đó với ngày tháng (ví dụ: tên tệp sao lưu). Sau khi chứng kiến ​​sự xấu xí chung của dòng lệnh Windows, tôi thấy tại sao Windows chủ yếu là điểm & nhấp :) Mặc dù họ nói rằng PowerShell mới tốt hơn.
Halil zgür

72

Lệnh FOR ! Trong khi tôi ghét viết các tập tin hàng loạt, tôi rất biết ơn về điều đó.

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

sẽ phân tích từng dòng trong myfile.txt, bỏ qua các dòng bắt đầu bằng dấu chấm phẩy, chuyển mã thông báo thứ 2 và thứ 3 từ mỗi dòng sang phần thân, với các thẻ được phân tách bằng dấu phẩy và / hoặc dấu cách. Lưu ý tham chiếu câu lệnh cơ thể% i để nhận mã thông báo thứ 2,% j để nhận mã thông báo thứ 3 và% k để nhận tất cả các mã thông báo còn lại sau lần thứ 3.

Bạn cũng có thể sử dụng điều này để lặp lại các thư mục, nội dung thư mục, v.v ...


4
Tôi đã tìm thấy các tệp bó 'FOR vòng lặp bị giới hạn và khủng khiếp để viết, nhưng đôi khi chúng rất hữu ích.
ya23

2
Xin lỗi cho sự bối rối của tôi, nhưng làm thế nào trên trái đất này được sử dụng? Tôi nghĩ rằng nếu bạn không biết vòng lặp FOR, bạn sẽ không biết kịch bản hàng loạt.
Mã hóa với phong cách

11
Sử dụng hay không, đó là tra tấn. (Một số người sẽ tranh luận về một điều ác cần thiết.)
harpo

Tôi đã phải sử dụng nó một vài lần và người tạo ra cú pháp này sẽ bị sa thải. Từ một khẩu pháo. Vào mặt trời. Đó là điều xấu.
VitalyB

1
@CodingWithStyle: Mỗi lần tôi cần viết một vòng lặp for trong một tệp bó, tập lệnh sẽ trở thành trình khởi chạy bash và viết lại tập lệnh trong bash (hoặc python) thay vào đó :)
idbrii

60

Thay vì xả một tập lệnh bằng các dòng REM hoặc ::, tôi thực hiện các thao tác sau ở đầu mỗi tập lệnh:

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

Lưu ý cách bạn có thể sử dụng các ký tự ống và chuyển hướng mà không thoát khỏi chúng.


3
Sẽ còn tuyệt hơn nữa nếu bạn kiểm tra% 1 cho "/?" và sau đó bạn có thể lặp lại phần đó dưới dạng văn bản trợ giúp.
demcodemonkey

6
Hmm, biết chữ lập trình hàng loạt?!
Muhammad Alkarouri

54

Đường dẫn (có ổ đĩa) trong đó tập lệnh là: ~ dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%

Tôi thường sử dụng% CD% cho việc này. Có lẽ nó không có sẵn trong tất cả các phiên bản shell DOS?
Saul Dolgin

11
% CD% là thư mục hiện tại trong khi% ~ dp0 là thư mục chứa tập lệnh đang chạy.
RealHowTo

Ngoài ra, tôi không nghĩ% CD% đã tồn tại trước ... XP, có thể. Tôi biết một số phiên bản Windows cũ hơn không có nó.
Thomas Owens

1
Thay vào đó, bạn nên sử dụng cd / d% BAT_HOME%, nếu bat nằm trong ổ đĩa khác. Nếu tôi nhớ chính xác, điều này sẽ không hoạt động với các DOS cũ hơn.
ketorin

cd hoặc pushd% BATH_HOME% sẽ không hoạt động nếu bạn chạy một lô trên đường dẫn mạng.
Benoit

49

Đoạn% ~ dp0 đã được đề cập, nhưng thực sự có nhiều hơn thế: ký tự sau ~ xác định thông tin được trích xuất.
Không có chữ cái nào dẫn đến việc trả lại tên tệp vá
d - trả về ký tự ổ đĩa
p - trả về đường dẫn
s - trả về đường dẫn ngắn
x - trả về phần mở rộng tệp
Vì vậy, nếu bạn thực thi tập lệnh test.bat bên dưới từ c: \ Temp \ thư mục tên dài \ thư mục,

@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0

bạn nhận được đầu ra sau

test
c:
\Temp\long dir name\
c:\Temp\long dir name\
.bat
c:\Temp\LONGDI~1\test.bat
\Temp\LONGDI~1\

Và nếu một tham số được truyền vào tập lệnh của bạn như trong
thử nghiệm c: \ temp \ mysrc \ test.cpp
thì các thao tác tương tự có thể được thực hiện với biến% 1.

Nhưng kết quả của việc mở rộng% 0 phụ thuộc vào vị trí!
Ở "cấp cao nhất" của lô, nó mở rộng thành tên tệp bó hiện tại.
Trong một hàm (gọi), nó mở rộng thành tên hàm.

@echo off
echo %0
call :test
goto :eof

:test
echo %0
echo %~0
echo %~n0

Đầu ra là (batchfile được bắt đầu với myBatch.bat)

myBatch.bat
:test
:test
myBatch

43

Bằng cách sử dụng CALL, EXIT / B, SETLOCAL & ENDLOCAL, bạn có thể triển khai chương trình con với các biến cục bộ.

thí dụ:

@echo off

set x=xxxxx
call :sub 10
echo %x%
exit /b

:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b

Cái này sẽ in

11
xxxxx

mặc dù: phụ sửa đổi x.


6
Bạn nên sử dụng goto: eof thay vì exit / b, thực hiện điều tương tự nhưng là cách tiêu chuẩn hơn để làm điều đó.
Philibert Perusse

2
Có một tiêu chuẩn cho điều này? O_o
Paulius

3
Lỗi của tôi. Tôi nghĩ bạn có nghĩa là xác định rõ ràng một nhãn: eof và thực hiện một goto đến đó. Tôi đã không nhận ra có một nhãn ẩn: eof ở cuối mỗi tệp bó.
Ferruccio

3
Tuy nhiên, nếu bạn muốn một chương trình con đặt lỗi, bạn sẽ cần sử dụng exit / b. Ví dụ: lối ra / b 3
Chris Noe

6
Tôi thấy tốt nhất là sử dụng "exit / B" thay vì "goto: eof" để trở về từ chương trình con, "goto: eof" có vấn đề là bạn có thể trả lại mã lỗi khi bạn muốn nuốt nó. Ví dụ: nếu bạn sử dụng "if tồn tại someFile echo it here", điều này sẽ đặt errorlevel nếu someFile không tồn tại, nhưng điều đó không sai và không phải là mã lỗi mà bạn muốn trả về (đó là những gì " goto: eof "sẽ làm).
Scott Langham

42

Thủ thuật lén lút để chờ N giây (không phải là một phần của cmd.exe nhưng không phải là phần mềm bổ sung vì nó đi kèm với Windows), hãy xem dòng ping. Bạn cần ping N + 1 kể từ khi ping đầu tiên tắt mà không bị trễ.

    echo %time%
    call :waitfor 5
    echo %time%
    goto :eof
:waitfor
    setlocal
    set /a "t = %1 + 1"
    >nul ping 127.0.0.1 -n %t%
    endlocal
    goto :eof

2
Thậm chí tốt hơn là đặt điều này trong một tập tin như ngủ.bat để tiết kiệm cho bạn những rắc rối khi viết lại nó nhiều lần.
er Giang

1
... và đặt chế độ ngủ.bat trong một số thư mục trong biến môi trường PATH
Scoregpson

Tôi chống lại việc này ở bên ngoài, làm cho ít di động hơn ... trên các hệ thống Windows.
sorin

37

Thoát khỏi "hệ thống ống nước":

echo ^| ^< ^> ^& ^\ ^^

3
Tôi cá là nhân vật thoát DOS không được biết đến nhiều. Tốt một.
Joshua

12
Ah, mà muốn giải thích lý do tại sao nó là các nhà điều hành tiếp tục dòng cũng - nó thoát xuống dòng, giống như \ trong bash ...
leander

@leander: Có, nhưng nó chỉ có thể thoát khỏi LF (chứ không phải CR), bởi vì tất cả các CR đã bị xóa trước đó
jeb

Vì vậy, đây là lý do tại sao việc sử dụng git trên Windows để tìm khác với cam kết trước đó ( HEAD^) là vấn đề.
Daniel Trebbien

31

Có thể chạy các lệnh và xử lý đầu ra (như backticks của '$ ()' trong bash).

for /f %i in ('dir /on /b *.jpg') do echo --^> %i

Nếu có khoảng trắng trong tên tệp, hãy sử dụng:

for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i

2
Không hoạt động với tên tệp có khoảng trắng trong tên của chúng ... Điều này hoạt động: for / f "tokens = *"% i in ('dir / on / b * .jpg') tạo tiếng vang - ^>% i
doekman

Nắm bắt tốt. Cá nhân tôi nghĩ rằng không gian trong tên tập tin là những thứ ghê tởm xấu xa từ sâu thẳm của vòng tròn địa ngục thứ chín. Nhưng chúng ta nên phục vụ cho họ, tôi đoán vậy.
paxdiablo

Đó là cú pháp điên rồ nhất tôi từng thấy. Nó có hoạt động không nếu bạn tạo backtick.bat này và truyền vào chuỗi?
idbrii

30

Tạo một tệp trống:

> copy nul filename.ext

6
@devio: tiếng vang. đặt một dòng trống. Vì vậy, tập tin sẽ không có sản phẩm nào!
Paulius

4
Tôi sử dụng type nul > filename.extcho điều đó.
Benoit

Rất vui, tôi đã tự hỏi nếu có một liên lạc tương đương trong một thời gian dài.
jdelator

Tôi đã luôn sử dụngren > blah.txt
Synetech

28

Để ẩn tất cả đầu ra từ một lệnh chuyển hướng đến> nul 2> & 1.

Ví dụ, một số chương trình dòng lệnh hiển thị đầu ra ngay cả khi bạn chuyển hướng đến> nul. Nhưng, nếu bạn chuyển hướng đầu ra như dòng bên dưới, tất cả đầu ra sẽ bị chặn.

PSKILL NOTEPAD >nul 2>&1

EDIT: Xem Bỏ qua đầu ra của lệnh để được giải thích về cách thức hoạt động của lệnh này.


1
Bạn có biết làm thế nào điều này hoạt động? Ý nghĩa của 2> & 1 bit là gì?
Scott Langham

12
> Nul chuyển hướng STDOUT sang nul. 2> & 1 chuyển hướng STDERR đến bất cứ nơi nào STDOUT đang trỏ.
aphoria

Cụ thể, tôi nghĩ rằng 2> & 1 là một "bản sao tập tin", đặt STDERR thành một bản sao của STDOUT. Đặt nó sau> NUL rất quan trọng, vì bạn muốn sao chép STDOUT sau khi nó đã được chuyển hướng chứ không phải trước đó. (Xin vui lòng sửa cho tôi nếu tôi sai ở đây.)
leander

1
Đối với những người bạn tự hỏi nơi pskill xuất phát từ, kiểm tra sysinternals.com . Nếu bạn đang sử dụng phiên bản Pro, bạn nên có lệnh TSKILL riêng giống hoặc ít hơn giống nhau.
Mã hóa với phong cách

1
Nếu bạn không có pskill hoặc tskill, hầu hết các hệ thống Windows tôi đã sử dụng đều đi kèm taskkill.
idbrii

25
PAUSE

Dừng thực thi và hiển thị lời nhắc sau:

Bấm phím bất kỳ để tiếp tục . . .

Hữu ích nếu bạn muốn chạy một lô bằng cách bấm đúp vào nó trong Windows Explorer và thực sự muốn xem đầu ra thay vì chỉ là một đèn flash của cửa sổ lệnh.


Tôi hầu như không gọi đây là "không được sử dụng" khi tôi gắn thẻ nó vào cuối mỗi kịch bản tôi viết. Sau đó, một lần nữa, nó không hoạt động tốt khi bạn muốn IDE của mình chạy tập lệnh và nắm bắt đầu ra, vì IDE không có cách nào để nhấn enter cho bạn thường ...
Nicholas Flynt

15
Một tính năng gọn gàng của "tạm dừng" là nếu không có xung quanh nhà ga để nhận được một "phím bất kỳ" (ví dụ như nếu tập tin thực thi của bạn được chạy từ một dịch vụ hệ thống), nó phát hiện này và chỉ giữ đi ...
leander

4
+1 cho Charlie Somerville, điều này được biết đến là 'go.bat' của mọi lập trình viên trò chơi đã sử dụng nó từ đầu những năm 90.
LiraNuna

6
Thay vì làm ô nhiễm tất cả các tệp bó của bạn (và khiến chúng khó chịu khi sử dụng cho các chuyên viên máy tính CLI), bạn có thể sử dụng Bắt đầu / Chạy / sau đó nhập 'cmd / k' và tên tệp bó. HOẶC thay đổi chuỗi mặc định của HKCR \ batfile \ shell \ open \ thành 'cmd / k "% 1"% *'. HOẶC tạo một tệp khác chỉ chạy '@cmd / k $ *', đặt nó trên màn hình nền và thả các tệp bó khác của bạn vào đó. Có rất nhiều lựa chọn thay thế cho PAUSE. Hãy xem xét chúng.
hệ thống PAUSE

1
@gnud: bạn vẫn có thể chuyển sang tập lệnh: echo.|batch-with-pause.batsẽ có tác dụng tương tự như nhấn 'phím bất kỳ' ...
Kurt Pfeifle

25

Tương đương với bash (và các shell khác)

echo -n Hello # or
echo Hello\\c

mà đầu ra " Hello" mà không có một dòng mới. Một hack cmd để làm điều này:

<nul set /p any-variable-name=Hello

set /plà một cách để nhắc người dùng nhập liệu. Nó phát ra chuỗi đã cho và sau đó chờ, (trên cùng một dòng, tức là không có CRLF), để người dùng nhập phản hồi.

<nul chỉ đơn giản là một câu trả lời trống rỗng cho set /p lệnh, vì vậy kết quả thực là chuỗi dấu nhắc phát ra. (Biến được sử dụng vẫn không thay đổi do phản hồi trống.)

Vấn đề là: Không thể tạo ra một dấu bằng hàng đầu và trên các ký tự khoảng trắng hàng đầu của Vista bị xóa, nhưng không phải trên XP.


18

Tìm kiếm và thay thế khi thiết lập các biến môi trường:

> @set fname=%date:/=%

... Xóa "/" khỏi ngày để sử dụng trong tên tệp được đánh dấu thời gian.

và các chuỗi con quá ...

> @set dayofweek=%fname:~0,3%

17

Số học số nguyên:

> SET /A result=10/3 + 1
4

Đã bao lâu thì SET có khả năng tính toán? Windows XP?
chakrit

1
Nếu bạn đang hỏi giá trị có thể lớn đến mức nào, tôi tin rằng đây là 32-bit. Vậy +/- 2 tỷ.
Chris Noe

1
Tôi nghĩ câu hỏi là, SET đã có thể tính toán được bao lâu rồi? Kể từ Windows XP?
Michael Myers

3
Tôi nghĩ rằng SET của CMD.EXE đã có thể tính toán từ NT 3.1 trở lên. Phải mất một thời gian dài để bất cứ ai cũng nhận thấy rằng CMD.EXE không hoàn toàn giống với HOL.COM ...
RBerteig

16

Dấu phân cách lệnh:

cls & dir
copy a b && echo Success
copy a b || echo Failure

Ở dòng thứ 2, lệnh sau && chỉ chạy nếu lệnh đầu tiên thành công.

Ở dòng thứ 3, lệnh sau | | chỉ chạy nếu lệnh đầu tiên thất bại.



15

Bạn có thể xâu chuỗi các câu lệnh để có được hiệu ứng như boolean ngắn mạch `và '.

if foo if bar baz

1
Đây thực sự chỉ là một phím tắt để lồng ifs: if foo ( if bar ( baz ) )(Hãy tưởng tượng các dòng mới sau dấu ngoặc.)
idbrii

14

Để nhanh chóng chuyển đổi tệp văn bản Unicode (16 bit / char) sang tệp ASCII DOS (8 bit / char).

C:\> type unicodeencoded.txt > dosencoded.txt

như một phần thưởng, nếu có thể, các ký tự được ánh xạ chính xác.


1
Đó là tệp ANSI DOS - ASCII là 7 bit / char.
MarkJ

Lol, cái này là một mô hình chống, chuyển đổi này có khả năng thất bại cao. Mã hóa 8 bit duy nhất hỗ trợ Unicode là UTF-8 nhưng nhờ M $, bạn không thể có bộ mã UTF-8 trên Windows.
sorin

14

nếu cấu trúc khối:

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)

3
Miễn là bạn biết rằng các biến sẽ được mở rộng tất cả trong một lần (không bị chậm mở rộng) - tức là bạn không thể sử dụng% ERRORLEVEL% trong đó một cách hợp lý.
Duncan Smart

Bạn cũng không thể sử dụng nhãn ở đó (bao gồm cả những bình luận :: kiểu) bởi vì nó sẽ kết thúc sớm câu lệnh if.
Mã hóa với phong cách

2
@Duncan: %ERRORLEVEL%Dù sao thì bạn cũng không nên sử dụng biến giả ; đó là những gì if errorlevel <foo>dành cho. Và điều đó thực tế hoạt động trong các khối như vậy.
Joey

12

Sự mở rộng của các biến bị trì hoãn (với các chuỗi con được đưa vào để đo lường tốt):

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set full=/u01/users/pax
:loop1
    if not "!full:~-1!" == "/" (
        set full2=!full:~-1!!full2!
        set full=!full:~,-1!
        goto :loop1
    )
    echo !full!
    endlocal

12

Không cung cấp nhiều chức năng, nhưng bạn có thể sử dụng lệnh tiêu đề cho một vài mục đích sử dụng, như cung cấp trạng thái trên một tập lệnh dài trong thanh tác vụ hoặc chỉ để nâng cao phản hồi của người dùng.

@title Searching for ...
:: processing search
@title preparing search results
:: data processing

2
Hấp dẫn. Mặc dù sau đó bạn dường như mất tính năng thông thường, đó là hiển thị lệnh hiện đang chạy. Có cách nào để thiết lập lại điều đó?
Chris Noe

2
technet.microsoft.com/en-us/l Library / bb491017.aspx nói rằng nó có thể được đặt lại bằng "title", nhưng điều này dường như không hoạt động trên Windows 7 ...
.

11

Không có trình chỉnh sửa tiện dụng và cần tạo một tệp bó?

copy con test.bat

Chỉ cần gõ các lệnh, nhấn enter cho một dòng mới. Nhấn Ctrl-Z và Enter để đóng tệp.


4
Heh, điều đó đưa tôi trở lại.
mã với phong cách

11

ví dụ về phép trừ chuỗi trên datetimeđể lấy tệp có tên "YYYY-MM-DD HH: MM: SS.txt"

echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"

Tôi sử dụng colorđể cho biết nếu tập lệnh của tôi kết thúc thành công, thất bại hoặc cần một số đầu vào bằng cách thay đổi màu sắc của văn bản và nền. Nó thực sự hữu ích khi bạn có một số máy trong tầm nhìn của bạn nhưng khá xa

màu XY

Trong đó X và Y là giá trị hex từ 0đến F, trong đó X - nền, Y - văn bản, khi màu X = Y sẽ không thay đổi.

màu Z

thay đổi màu văn bản thành 'Z' và đặt nền đen, 'màu 0' sẽ không hoạt động

cho tên của màu sắc gọi

màu sắc ?


chỉnh sửa; các _ được hiểu là chữ nghiêng. Một chút tốt đẹp của mã.

@Duncan Smart: không đúng sự thật, cũng hoạt động bằng tiếng Anh Anh (mặc dù về mặt kỹ thuật nó phải là "màu sắc", grrr)
demcodemonkey

10

Tổng kiểm soát đầu ra với các ký tự khoảng cách và thoát:

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>

1
Làm thế nào mà làm việc? Dấu chấm phân định đầu của văn bản đầu ra?
Chris Noe

3
"echo. x" sẽ xuất ra "<dấu cách> x", "echo x" sẽ chỉ xuất ra "x". Điều này cho phép không gian hàng đầu. Ngoài ra, ký tự thoát "^" sẽ ngăn cmd nghĩ tất cả các ký tự "<" và ">" đó là chuyển hướng I / O.
paxdiablo

1
echo (là tốt hơn, vì tiếng vang tạo ra một tập tin tìm kiếm cho một tập tin có tên là "echo" nếu tập tin này tồn tại echo thất bại, nếu không thì tiếng vang nội bộ được thực thi, nhưng nó là chậm hơn so với echo (..
Jeb

9

TheSoftwareJedi đã đề cập đến lệnh for, nhưng tôi sẽ đề cập lại vì nó rất mạnh.

Sau đây xuất ra ngày hiện tại ở định dạng YYYYMMDD, tôi sử dụng điều này khi tạo thư mục để sao lưu.

for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a

2
Chắc chắn DATE / T trả lại 29/10/2008 ở châu Âu và 29/10/2008 tại Mỹ ... vì vậy một số nội địa hóa có thể được yêu cầu! ;-)

Đúng rồi! Nhưng bạn có thể lạm dụng lệnh date để tìm ra định dạng ngày nào được sử dụng.
remonedo

4
Đó là sử dụng quá mức FOR, imo. Tôi nghĩ rằng tôi sẽ chỉ sử dụng% DATE: ~ 10,4 %% DATE: ~ 4.2 %% DATE: ~ 7.2% cho điều đó thay vì chạy lệnh ngày sau đó phân tích cú pháp đó.
mã với phong cách
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.