คุณสมบัติที่ซ่อนของแบตช์ไฟล์ Windows


232

มีคุณสมบัติอะไรบ้างที่ทราบน้อยกว่า แต่มีคุณสมบัติที่สำคัญและมีประโยชน์ของไฟล์แบตช์ของ Windows

แนวทาง:

  • หนึ่งคุณลักษณะต่อคำตอบ
  • ให้คำอธิบายสั้น ๆเกี่ยวกับคุณสมบัติและตัวอย่างไม่ใช่แค่ลิงก์ไปยังเอกสารประกอบ
  • จำกัด คำตอบสำหรับฟังก์ชั่นดั้งเดิมเช่นไม่ต้องการซอฟต์แวร์เพิ่มเติมเช่นWindows Resource Kit

การชี้แจง: เราอ้างถึงสคริปต์ที่ประมวลผลโดย cmd.exe ซึ่งเป็นค่าเริ่มต้นในชุดรูปแบบ WinNT

(ดูเพิ่มเติมที่: ไฟล์แบตช์ Windows: .bat vs .cmd? )

คำตอบ:


185

ความต่อเนื่องของสาย:

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
ฉันกำลังมองหาสัปดาห์นี้! (จำตัวละครไม่ได้)
chilltemp

21
^ เป็นถ่านที่พูดจริงๆ คุณสามารถใช้เครื่องหมาย <และ> เพื่อไม่ให้เปลี่ยนทิศทางเอาต์พุต ^ ที่ตอนท้ายของบรรทัดยังอนุญาตให้มีการต่อเนื่องของบรรทัด
Cheeso

คุณช่วยอธิบายสคริปต์เล็ก ๆ นี้หน่อยได้ไหม?
guerda

2
@furtelwart: นี่เหมือนกับว่าคุณเขียนทั้งหมดไว้ในบรรทัดเดียว: call C:\WINDOWS\system32\ntbackup.exe backup /V:yes /R:no /RS:no /HC:off /M normal /L:s @daily.bks /F daily.bkf. C:\WINDOWS\system32\ntbackup.exe /?และเข้าใจทุกพารามิเตอร์ของสายที่เรียกเพียง
Kurt Pfeifle

การอภิปรายเชิงลึกเกี่ยวกับหัวข้อนี้ที่คำสั่งยาวแยกหลายบรรทัด
jeb

150
PUSHD path

จะพาคุณไปยังไดเรกทอรีที่ระบุโดยเส้นทาง

POPD

นำคุณกลับไปยังไดเรกทอรีที่คุณ "ผลัก" จาก


5
สิ่งนี้ยังทำหน้าที่เป็นสแต็กแบบเต็มดังนั้นคุณสามารถพุชไดเรกทอรีจำนวนมากไปยังสแต็ก
Kibbee

อย่างจริงจัง? ฉันไม่เคยได้ยินคุณลักษณะนี้มาก่อนเลย!
Josh Hinman

4
เรียกใช้ 'cmd.exe' จากนั้นพิมพ์ 'help' จากนั้นพิมพ์ 'help pushd' หรือ 'pushd /?'
paxdiablo

86
หากคุณผลักดันไปยังเส้นทาง UNC มันจะแมปไดรฟ์ให้คุณโดยอัตโนมัติและป๊อปอัปจะยกเลิกการแมป
Ferruccio

2
+1 โดยเฉพาะอย่างยิ่งสำหรับความสามารถของ UNC คุณควรเพิ่มเข้าไปในคำตอบของคุณ
Adam Mitz

109

ไม่แน่ใจว่ามีประโยชน์เพียงใดในไฟล์แบตช์แต่เป็นคำสั่งที่สะดวกมากที่จะใช้ในพรอมต์คำสั่ง:

C:\some_directory> start .

จะเป็นการเปิด Windows Explorer ในโฟลเดอร์ "some_directory"

ฉันได้พบสิ่งนี้เป็นการประหยัดเวลาที่ยอดเยี่ยม


1
ฉันก็ใช้มันเหมือนกัน ฉันมีไฟล์ "open.cmd" ในหนึ่งในไดเรกทอรี PATH และสิ่งเดียวในไฟล์นั้นคือ "@start" ;)
เปาโล

5
'explorer' ก็ทำเช่นเดียวกันกับ 'start' C: \ some_directory> explorer
เรย์

1
ฉันมักจะพิมพ์สิ่งนี้เป็น [start "" ] (วงเล็บเพื่อความกระจ่าง) เพราะการเริ่มต้นนั้นบางครั้งพิถีพิถันเกี่ยวกับ param แรกที่เป็นชื่อ
ระบบหยุดชั่วคราว

1
หากคุณเกิดขึ้นกับ Mac open .ทำสิ่งเดียวกัน
พอล

1
startทำอะไรได้มากกว่าเพียงแค่เปิดโฟลเดอร์ปัจจุบัน คุณสามารถส่งต่อไฟล์ใดก็ได้และไฟล์จะเปิดขึ้นพร้อมกับวิวเวอร์ที่กำหนดค่าไว้ ให้ URL กับมันและเบราว์เซอร์เริ่มต้นของคุณจะเปิดขึ้น ฯลฯ ...
idbrii

87

ฉันพบว่ามันยากที่จะอ่านความคิดเห็นที่ถูกทำเครื่องหมายด้วยคำสำคัญในแต่ละบรรทัด:

REM blah blah blah

ง่ายต่อการอ่าน:

:: blah blah blah

8
ฉันได้ยิน :: มีประสิทธิภาพมากกว่า REM เนื่องจาก REM พยายามทำการขยายตัวแปรสภาพแวดล้อมบนสิ่งที่เกิดขึ้นหลังจากนั้น แต่ :: ไม่
Scott Langham

47
ในความเป็นจริง :: เป็นเพียงป้ายกำกับที่มีชื่อตลก ดังนั้น :: จะไม่ทำงานหากคุณใช้ภายในบล็อก (ในวงเล็บ) เนื่องจากไม่อนุญาตให้ใช้ป้ายกำกับ REM ทำงานที่นั่นแน่นอน
mihi

โปรดทราบว่าremนี่เป็นคำหลักที่มีเอกสารในขณะที่::เป็นเพียงรายละเอียดการปฏิบัติ ในขณะที่ไม่น่าที่::จะหยุดทำงานได้ แต่โดยทั่วไปแล้วไม่แนะนำให้ใช้พฤติกรรมที่ไม่มีเอกสาร
Joey

คุณสามารถใช้goto :เพื่อข้ามไปที่ป้ายกำกับ :-)และgoto -)ยังจะทำงาน
Sven Marnach

79

สตริงย่อยของตัวแปร:

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

3
น่าเกลียด แต่มีประโยชน์มาก veery!
guerda

1
@furtelwart ดูเหมือนว่าอาจเป็นชุดคำขวัญ
rzrgenesys187

สิ่งนี้ยอดเยี่ยมสำหรับการจัดรูปแบบวันที่ (แต่ปัญหาที่ฉันพบคือว่า vista / 7 และ xp เอาต์พุต DATE แตกต่างกัน)
Daniel

โปรดทราบว่าน่าเสียดายที่สิ่งนี้ไม่สามารถรวมกับตัวแปรโลคอลของ FOR ลูป ( for %a in ...) เนื่องจากไม่ต้องการเครื่องหมายเปอร์เซ็นต์การปิดเช่นเดียวกับตัวแปรสภาพแวดล้อม ก่อนอื่นคุณต้องกำหนดให้กับตัวแปรสภาพแวดล้อม (โดยใช้การขยายที่ล่าช้า!) แล้วแยกสตริงย่อย
RolKau

นี่เป็นสิ่งที่หลีกเลี่ยงไม่ได้หากคุณต้องการทำอะไรกับวันที่ (เช่นชื่อไฟล์สำรอง) หลังจากเห็นความน่าเกลียดทั่วไปของบรรทัดคำสั่งของ Windows ฉันเห็นว่าเหตุใด Windows จึงเป็นจุดสำคัญ & คลิก :) แม้ว่าพวกเขาจะบอกว่า PowerShell ใหม่ดีกว่า
Halil Özgür

72

คำสั่ง FOR ! ในขณะที่ฉันเกลียดการเขียนไฟล์แบตช์ฉันรู้สึกขอบคุณ

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

จะแยกแต่ละบรรทัดใน myfile.txt โดยไม่สนใจบรรทัดที่ขึ้นต้นด้วยเครื่องหมายอัฒภาคผ่านโทเค็นที่ 2 และ 3 จากแต่ละบรรทัดไปยัง for body โดยมีโทเค็นคั่นด้วยเครื่องหมายจุลภาคและ / หรือช่องว่าง สังเกตุสำหรับการอ้างอิงข้อความสั่ง body เพื่อรับโทเค็นที่ 2,% j เพื่อรับโทเค็นที่ 3 และ% k เพื่อรับโทเค็นที่เหลือทั้งหมดหลังจากที่ 3

คุณสามารถใช้สิ่งนี้เพื่อย้ำไดเรกทอรีไดเรกทอรีเนื้อหา ฯลฯ ...


4
ฉันพบไฟล์แบทช์ 'สำหรับลูปที่มี จำกัด และแย่มากในการเขียน
ya23

2
ขอโทษ bafflement ของฉัน แต่วิธีนี้บนพื้นดิน underused? ฉันคิดว่าถ้าคุณไม่รู้ FOR loops คุณก็ไม่รู้การเขียนสคริปต์แบบกลุ่ม
เข้ารหัสด้วยสไตล์

11
Underused หรือไม่ก็เป็นการทรมาน (บางคนอาจจะเถียงชั่วร้ายที่จำเป็น.)
ฮาร์โป

ฉันต้องใช้มันสองสามครั้งและผู้ที่สร้างไวยากรณ์นี้ควรถูกไล่ออก จากปืนใหญ่ เข้าไปกลางแดด มันแย่ขนาดนั้น
VitalyB

1
@CodingWithStyle: ทุกครั้งที่ฉันต้องการเขียน a for loop ในแบตช์ไฟล์สคริปต์จะกลายเป็น bash launcher และเขียนสคริปต์ใหม่ใน bash (หรือ python) แทน
:)

60

แทนที่จะทิ้งสคริปต์ที่มีบรรทัด REM หรือ :: ฉันจะทำสิ่งต่อไปนี้ที่ด้านบนของแต่ละสคริปต์:

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

สังเกตว่าคุณสามารถใช้ไพพ์และอักขระการเปลี่ยนทิศทางได้อย่างไรโดยไม่ต้องหลบหนี


3
จะยิ่งเย็นลงถ้าคุณตรวจสอบ% 1 สำหรับ "/?" จากนั้นคุณสามารถสะท้อนส่วนนั้นเป็นข้อความช่วยเหลือได้
demoncodemonkey

6
อืมการเขียนโปรแกรมแบบรู้หนังสือชุด!
Muhammad Alkarouri

54

เส้นทาง (พร้อมไดรฟ์) โดยที่สคริปต์คือ: ~ dp0

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

ฉันมักจะใช้% CD% สำหรับสิ่งนี้ อาจจะไม่สามารถใช้ได้กับทุกรุ่นของเชลล์ DOS?
ซาอูลดอลกิน

11
% CD% เป็นไดเรกทอรีปัจจุบันในขณะที่% ~ dp0 เป็นไดเรกทอรีที่ใช้งานสคริปต์อยู่
RealHow ถึง

นอกจากนี้ฉันไม่คิดว่ามี% CD% มาก่อน ... XP อาจจะ ฉันรู้ว่า Windows รุ่นเก่าบางรุ่นไม่มีอยู่
Thomas Owens

1
คุณควรใช้ cd / d% BAT_HOME% แทนหากค้างคาวอยู่ในไดรฟ์อื่น ถ้าฉันจำได้อย่างถูกต้องสิ่งนี้จะไม่ทำงานกับ DOSes รุ่นเก่า
ketorin

cd หรือ pushd% BATH_HOME% จะไม่ทำงานหากคุณเรียกใช้แบทช์บนเส้นทางเครือข่าย
เบอนัวต์

49

มีการพูดถึงชิ้นส่วน% ~ dp0 แล้ว แต่มีมากกว่านั้นจริง: อักขระ (s) หลังจากที่ ~ กำหนดข้อมูลที่ถูกแยกออกมา
ไม่มีผลลัพธ์ตัวอักษรในการส่งคืนไฟล์ปะชื่อ
d - ส่งคืนไดรฟ์อักษร
p - ส่งคืนพา ธ
s - ส่งคืนพา ธ สั้น
x - ส่งคืนนามสกุลไฟล์
ดังนั้นหากคุณเรียกใช้งานสคริปต์ test.bat ด้านล่างจาก c: \ Temp \ ยาวชื่อ dir \ โฟลเดอร์,

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

คุณได้รับผลลัพธ์ต่อไปนี้

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

และหากพารามิเตอร์ถูกส่งผ่านไปยังสคริปต์ของคุณเช่นเดียวกับใน
การทดสอบ c: \ temp \ mysrc \ test.cpp
การปรับแต่งแบบเดียวกันสามารถทำได้ด้วยตัวแปร% 1

แต่ผลลัพธ์ของการขยายตัวของ% 0 ขึ้นอยู่กับตำแหน่ง!
ที่ "ระดับสูงสุด" ของแบทช์จะขยายเป็นชื่อแบทช์ปัจจุบัน
ในฟังก์ชั่น (โทร) มันจะขยายไปยังชื่อฟังก์ชั่น

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

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

ผลลัพธ์คือ (batchfile เริ่มต้นด้วย myBatch.bat)

myBatch.bat
:test
:test
myBatch

43

โดยใช้ CALL, EXIT / B, SETLOCAL & ENDLOCAL คุณสามารถใช้รูทีนย่อยด้วยตัวแปรโลคอล

ตัวอย่าง:

@echo off

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

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

สิ่งนี้จะพิมพ์

11
xxxxx

แม้ว่า: sub จะแก้ไข x


6
คุณควรใช้ goto: eof แทน exit / b ทำสิ่งเดียวกัน แต่เป็นวิธีมาตรฐานมากกว่าที่จะทำ
Philibert Perusse

2
มีมาตรฐานสำหรับสิ่งนี้หรือไม่? O_o
Paulius

3
ความผิดพลาดของฉัน. ฉันคิดว่าคุณหมายถึงการกำหนดป้ายกำกับ eof อย่างชัดเจนและทำข้ามไป ฉันไม่ได้ตระหนักว่ามีป้ายกำกับ impl: eof ในตอนท้ายของทุกไฟล์แบทช์
Ferruccio

3
อย่างไรก็ตามหากคุณต้องการให้รูทีนย่อยตั้ง errorlevel คุณจะต้องใช้ exit / b ตัวอย่างเช่น: exit / b 3
Chris Noe

6
ฉันพบว่าควรใช้ "exit / B" แทน "goto: eof" เพื่อกลับจากรูทีนย่อย "goto: eof" มีปัญหาที่คุณอาจส่งคืนรหัสข้อผิดพลาดเมื่อคุณต้องการกลืนมัน ตัวอย่างเช่นหากคุณใช้ "ถ้ามี someFile echo อยู่ที่นี่" จะเป็นการตั้ง errorlevel หาก someFile ไม่มีอยู่ แต่นั่นไม่ผิดและไม่ใช่รหัสข้อผิดพลาดที่คุณต้องการส่งคืน (ซึ่งก็คือ " goto: eof "จะทำ)
Scott Langham

42

เคล็ดลับส่อเสียดที่จะรอ N วินาที (ไม่ใช่ส่วนหนึ่งของ cmd.exe แต่ไม่ใช่ซอฟต์แวร์พิเศษเนื่องจากมันมาพร้อมกับ Windows) ดูบรรทัด ping คุณต้องมีการปิง N + 1 ตั้งแต่การปิงครั้งแรกออกไปโดยไม่ล่าช้า

    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
ยิ่งไปกว่านั้นคือการใส่สิ่งนี้ลงในไฟล์อย่าง sleep.bat เพื่อช่วยให้คุณไม่ต้องเขียนซ้ำไปซ้ำมา
erjiang

1
... และวาง sleep.bat ในบางไดเร็กทอรีในตัวแปรสภาพแวดล้อม PATH
Scoregraphic

ฉันไม่ได้ใส่สิ่งนี้ไว้ข้างนอกทำให้พกพาน้อยลง ... ในระบบ Windows
sorin

37

หนี "ประปา":

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

3
ฉันจะเดิมพันอักขระหลบหนี DOS ไม่เป็นที่รู้จัก สิ่งที่ดี.
Joshua

12
อาที่จะอธิบายว่าทำไมจึงเป็นผู้ประกอบการต่อเนื่องเส้นได้เป็นอย่างดี - มันหนีขึ้นบรรทัดใหม่เช่นเดียวกับ \ ในทุบตี ...
Leander

@leander: ใช่ แต่มันสามารถหลบหนี LF (และไม่ CR) เนื่องจาก CRs ทั้งหมดจะถูกลบออกก่อน
Jeb

ดังนั้นนี่คือสาเหตุที่การใช้ git บน Windows เพื่อให้แตกต่างกับการคอมมิทก่อนหน้า ( HEAD^) เป็นปัญหา
Daniel Trebbien

31

ความสามารถในการเรียกใช้คำสั่งและประมวลผลเอาต์พุต (เช่น backticks ของ '$ ()' เป็น bash)

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

หากมีช่องว่างในชื่อไฟล์ให้ใช้สิ่งนี้:

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

2
ไม่ทำงานกับชื่อไฟล์ที่มีช่องว่างในชื่อ ... ใช้งานได้: สำหรับ / f "tokens = *"% i in ('dir / on / b * .jpg') ทำเสียงสะท้อน - ^>% i
doekman

จับดี. โดยส่วนตัวฉันคิดว่าช่องว่างในชื่อไฟล์เป็นสิ่งที่น่าเกลียดน่ากลัวจากส่วนลึกของวงกลมที่เก้าของนรก แต่เราควรจะตอบสนองพวกเขาฉันเดา
paxdiablo

นั่นเป็นไวยากรณ์ที่บ้าที่สุดที่ฉันเคยเห็น มันใช้งานได้ถ้าคุณทำ backtick.bat และส่งผ่านสตริงหรือไม่
idbrii

30

การสร้างไฟล์เปล่า:

> copy nul filename.ext

6
@devio: echo ใส่บรรทัดว่าง ดังนั้นไฟล์จะไม่ว่างเปล่า!
เปาโล

4
ฉันใช้type nul > filename.extสำหรับสิ่งนั้น
เบอนัวต์

ดีฉันสงสัยว่ามีสัมผัสที่เทียบเท่าเป็นเวลานาน
jdelator

ฉันใช้เสมอren > blah.txt
Synetech

28

หากต้องการซ่อนเอาต์พุตทั้งหมดจากคำสั่งให้เปลี่ยนเส้นทางไปที่> nul 2> & 1

ตัวอย่างเช่นโปรแกรมบรรทัดคำสั่งบางโปรแกรมจะแสดงเอาต์พุตแม้ว่าคุณจะเปลี่ยนเส้นทางไปที่> nul แต่ถ้าคุณเปลี่ยนเส้นทางผลลัพธ์เช่นบรรทัดด้านล่างผลลัพธ์ทั้งหมดจะถูกระงับ

PSKILL NOTEPAD >nul 2>&1

แก้ไข: ดูละเว้นการส่งออกของคำสั่งสำหรับคำอธิบายวิธีการทำงาน


1
คุณรู้วิธีการทำงานนี้หรือไม่? ความหมายของ 2> & 1 บิตคืออะไร
Scott Langham

12
>> nul เปลี่ยนเส้นทาง STDOUT ไปที่ nul 2> & 1 เปลี่ยนเส้นทาง STDERR ไปทุกที่ที่ STDOUT ชี้
aphoria

โดยเฉพาะฉันคิดว่า 2> & 1 เป็น "filehandle clone" โดยตั้งค่า STDERR เป็น clone ของ STDOUT การวางไว้หลัง> NUL นั้นสำคัญเพราะคุณต้องการโคลน STDOUT หลังจากถูกเปลี่ยนเส้นทางไม่ใช่ก่อนหน้านี้ (โปรดถูกต้องฉันหากฉันผิดที่นี่.)
Leander

1
สำหรับบรรดาของคุณสงสัยที่ PSKILL มาจากการตรวจสอบsysinternals.com หากคุณใช้ Pro edition คุณควรมีคำสั่ง TSKILL แบบดั้งเดิมที่มากหรือน้อยเหมือนกัน
เข้ารหัสด้วยสไตล์

1
หากคุณไม่ได้มี pskill หรือ tskill ระบบของ Windows taskkillที่สุดที่ผมเคยใช้มาพร้อมกับ
idbrii

25
PAUSE

หยุดการทำงานและแสดงพรอมต์ต่อไปนี้:

กดปุ่มใดก็ได้เพื่อดำเนินการต่อ . .

มีประโยชน์หากคุณต้องการเรียกใช้ชุดงานโดยดับเบิลคลิกใน Windows Explorer และต้องการเห็นผลลัพธ์จริง ๆ ไม่ใช่เพียงแค่แฟลชในหน้าต่างคำสั่ง


ฉันแทบจะไม่เรียกสิ่งนี้ว่า "underused" เนื่องจากฉันติดแท็กไว้ที่ส่วนท้ายของสคริปต์ที่ฉันเขียน จากนั้นอีกครั้งมันทำงานได้ไม่ดีนักเมื่อคุณต้องการให้ IDE ของคุณรันสคริปต์และจับเอาท์พุทเนื่องจาก IDE ไม่มีวิธีกดสำหรับคุณตามปกติ ...
Nicholas Flynt

15
หนึ่งคุณลักษณะเรียบร้อยของ "หยุด" คือว่าถ้าไม่มีรอบขั้วจะได้รับ "ปุ่มใด ๆ" (เช่นถ้าแบทช์ไฟล์ของคุณจะถูกเรียกใช้จากการให้บริการระบบ) ตรวจพบนี้และเพียงแค่เก็บไป ...
Leander

4
+1 ถึง Charlie Somerville ซึ่งเป็นที่รู้จักกันดีว่า 'go.bat' ของโปรแกรมเมอร์เกมทุกคนใช้มันในช่วงต้นยุค 90
LiraNuna

6
แทนที่จะทำให้ไฟล์แบตช์ของคุณสกปรก (และทำให้มันน่ารำคาญสำหรับใช้กับ CLI) คุณสามารถใช้ Start / Run / จากนั้นพิมพ์ 'cmd / k' และชื่อแบทช์ หรือเปลี่ยน HKCR \ batfile \ shell \ open \ command สตริงเริ่มต้นเป็น 'cmd / k "% 1"% *' หรือสร้าง batchfile อื่นที่เพิ่งเรียกใช้ '@cmd / k $ *' วางไว้บนเดสก์ท็อปและวางแบตช์ไฟล์อื่นของคุณลงไป มีทางเลือกมากมายสำหรับ PAUSE โปรดพิจารณาพวกเขา
ระบบหยุดชั่วคราว

1
@gnud: คุณยังสามารถไปที่สคริปต์: echo.|batch-with-pause.batจะมีผลเช่นเดียวกับการกดปุ่ม 'any-key' ...
Kurt Pfeifle

25

เทียบเท่าของ bash (และกระสุนอื่น ๆ )

echo -n Hello # or
echo Hello\\c

ซึ่งเอาต์พุต " Hello" โดยไม่ขึ้นบรรทัดใหม่ cmd hack เพื่อทำสิ่งนี้:

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

set /pเป็นวิธีการแจ้งให้ผู้ใช้ป้อนข้อมูล มันปล่อยสตริงที่กำหนดแล้วรอ (ในบรรทัดเดียวกันคือไม่มี CRLF) เพื่อให้ผู้ใช้พิมพ์คำตอบ

<nul เพียงแค่ท่อตอบสนองที่ว่างเปล่าไปยัง set /pคำสั่งดังนั้นผลลัพธ์สุทธิคือสตริงพรอมต์ที่ปล่อยออกมา (ตัวแปรที่ใช้ยังคงไม่เปลี่ยนแปลงเนื่องจาก reponse ว่างเปล่า)

ปัญหาคือ: มันเป็นไปไม่ได้ที่จะเอาท์พุทเครื่องหมายเท่ากับนำหน้าและบนตัวอักษรนำช่องว่างของ Vista จะถูกลบ แต่ไม่ใช่ใน XP


18

ค้นหาและแทนที่เมื่อตั้งค่าตัวแปรสภาพแวดล้อม:

> @set fname=%date:/=%

... ลบ "/" ออกจากวันที่เพื่อใช้ในชื่อไฟล์ประทับเวลา

และสตริงย่อยด้วย ...

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

17

เลขคณิตจำนวนเต็ม:

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

ตลาดหลักทรัพย์มีความสามารถในการคำนวณนานแค่ไหน Windows XP
chakrit

1
หากคุณถามว่าค่าสามารถเป็นเท่าใดฉันเชื่อว่านี่เป็นแบบ 32 บิต ดังนั้น +/- 2 พันล้าน
คริส Noe

1
ฉันคิดว่าคำถามคือตลาดหลักทรัพย์สามารถคำนวณได้นานเท่าไร ตั้งแต่ Windows XP
Michael Myers

3
สิ่งที่ตลาดหลักทรัพย์ CMD.EXE ของฉันสามารถคำนวณได้ตั้งแต่ NT 3.1 หรือมากกว่านั้น มันใช้เวลานานสำหรับทุกคนที่จะสังเกตเห็นว่า CMD.EXE นั้นไม่เหมือนกับ COMMAND.COM ...
RBerteig

16

ตัวคั่นคำสั่ง:

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

ที่บรรทัดที่ 2 คำสั่งหลังจาก && จะทำงานหากคำสั่งแรกประสบความสำเร็จ

ที่บรรทัดที่ 3 คำสั่งหลัง || รันเฉพาะในกรณีที่คำสั่งแรกล้มเหลว



15

คุณสามารถโยงถ้าข้อความเพื่อให้ได้ผลเช่นบูลีนลัดวงจร `และ '

if foo if bar baz

1
นี่เป็นเพียงช็อตคัตสำหรับการซ้อน ifs: if foo ( if bar ( baz ) )(ลองนึกภาพการขึ้นบรรทัดใหม่หลังวงเล็บ)
idbrii

14

เพื่อแปลงไฟล์ข้อความ Unicode (16 บิต / อักขระ) เป็นไฟล์ ASCII DOS อย่างรวดเร็ว (8 บิต / อักขระ)

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

หากเป็นไปได้โบนัสจะถูกแมปอักขระอย่างถูกต้อง


1
นั่นคือไฟล์ ANSI DOS - ASCII คือ 7 บิต / ถ่าน
MarkJ

ฮ่า ๆ อันนี้เป็นรูปแบบต่อต้านการแปลงนี้มีแนวโน้มสูงที่จะล้มเหลว การเข้ารหัส 8 บิตเท่านั้นที่สนับสนุน Unicode คือ UTF-8 แต่ต้องขอบคุณ M $ คุณไม่สามารถตั้งค่าเพจรหัส UTF-8 บน Windows ได้
sorin

14

ถ้าโครงสร้างบล็อก:

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

3
ตราบใดที่คุณทราบว่าตัวแปรจะถูกขยายทั้งหมดในครั้งเดียว (โดยไม่มีการขยายล่าช้า) - นั่นคือคุณไม่สามารถใช้% ERRORLEVEL% ในนั้นได้
Duncan Smart

คุณยังไม่สามารถใช้ป้ายกำกับที่นั่น (ซึ่งรวมถึงความคิดเห็นสไตล์ :: เหล่านั้น) เพราะจะสิ้นสุดก่อนกำหนดคำสั่ง if
เข้ารหัสด้วยสไตล์

2
@Duncan: คุณไม่ควรใช้หลอกตัวแปร%ERRORLEVEL%อยู่แล้ว นั่นคือสิ่งที่if errorlevel <foo>มีไว้เพื่อ และที่ไม่อยู่ในความเป็นจริงการทำงานในบล็อกดังกล่าว
Joey

12

การขยายตัวของตัวแปรล่าช้า (โดยมีสายย่อยโยนเข้ามาเพื่อวัดที่ดี):

    @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

ไม่ได้มีฟังก์ชันการทำงานมากนัก แต่คุณสามารถใช้คำสั่ง title สำหรับการใช้งานสองสามอย่างเช่นการแสดงสถานะของสคริปต์แบบยาวในแถบงานหรือเพียงเพื่อปรับปรุงความคิดเห็นของผู้ใช้

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

2
น่าสนใจ แม้ว่าหลังจากนั้นคุณจะสูญเสียคุณสมบัติปกติซึ่งจะแสดงคำสั่งที่ทำงานอยู่ในปัจจุบัน มีวิธีการตั้งค่าใหม่หรือไม่?
Chris Noe

2
technet.microsoft.com/en-us/library/bb491017.aspxกล่าวว่าสามารถรีเซ็ตได้ด้วย "title" ด้วยตัวของมันเอง แต่ดูเหมือนว่ามันจะไม่ทำงานบน Windows 7 ...

11

ไม่มีเครื่องมือแก้ไขที่มีประโยชน์และจำเป็นต้องสร้างไฟล์แบตช์ใช่ไหม

copy con test.bat

เพียงพิมพ์คำสั่งให้กด Enter เพื่อขึ้นบรรทัดใหม่ กด Ctrl-Z และ Enter เพื่อปิดไฟล์


4
เฮ้พาฉันกลับมาแล้ว
เข้ารหัสด้วยสไตล์

11

ตัวอย่างของการลบสตริงdateและtimeเพื่อรับไฟล์ชื่อ "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"

ฉันใช้colorเพื่อระบุว่าสคริปต์ของฉันประสบความสำเร็จล้มเหลวหรือต้องการอินพุตโดยการเปลี่ยนสีของข้อความและพื้นหลัง มันช่วยได้จริง ๆ เมื่อคุณมีเครื่องที่มองเห็น แต่อยู่ไกลออกไป

สี XY

โดยที่ X และ Y คือค่าฐานสิบหกจาก0ถึงFโดยที่ X - background, Y - text เมื่อ X X Y จะไม่เปลี่ยน

สี Z

เปลี่ยนสีข้อความเป็น 'Z' และตั้งค่าพื้นหลังสีดำ 'สี 0' จะไม่ทำงาน

สำหรับชื่อของสีที่โทร

สี ?


แก้ไข; _ ถูกตีความว่าเป็นตัวเอียง โค้ดดีมาก

@ ดันแคนสมาร์ท: ไม่เป็นความจริงและใช้งานได้ในภาษาอังกฤษแบบอังกฤษ (แม้ว่าในทางเทคนิคแล้วมันควรจะเป็น "สี",
grrr

10

ควบคุมการส่งออกทั้งหมดด้วยระยะห่างและตัวละครหนี:

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

1
มันทำงานอย่างไร จุดแสดงถึงจุดเริ่มต้นของเอาต์พุตข้อความหรือไม่
Chris Noe

3
"echo. x" จะแสดงผล "<space> x", "echo x" จะส่งออกเฉพาะ "x" สิ่งนี้อนุญาตให้มีช่องว่างนำหน้า นอกจากนี้อักขระ "^" escape จะป้องกัน cmd ไม่ให้คิดว่าอักขระ "<" และ ">" ทั้งหมดเป็นการเปลี่ยนเส้นทาง I / O
paxdiablo

1
echo (ดีกว่าเพราะ echo. สร้างการค้นหาไฟล์สำหรับไฟล์ที่ชื่อ "echo" หากไฟล์นี้มี echo. ล้มเหลวหากไม่ได้ดำเนินการ echo ภายใน แต่จะช้ากว่า echo (
jeb

9

TheSoftwareJedi พูดถึงคำสั่ง for แล้ว แต่ฉันจะพูดถึงมันอีกครั้งเพราะมันทรงพลังมาก

ต่อไปนี้จะแสดงวันที่ปัจจุบันในรูปแบบ YYYYMMDD ฉันใช้สิ่งนี้เมื่อสร้างไดเรกทอรีสำหรับการสำรองข้อมูล

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

2
แน่นอน DATE / T ส่งคืน 29/10/2008 ในยุโรปและ 10/29/2008 ในสหรัฐอเมริกา ... ดังนั้นอาจจำเป็นต้องใช้การแปลบางอย่าง! ;-)

ถูกตัอง! แต่คุณสามารถใช้คำสั่ง date เพื่อดูว่าใช้รูปแบบวันที่ใด
remonedo

4
มันใช้มากเกินไปสำหรับ, imo ฉันคิดว่าฉันจะใช้% DATE: ~ 10,4 %% DATE: ~ 4,2 %% DATE: ~ 7,2% สำหรับสิ่งนั้นแทนที่จะเรียกใช้คำสั่ง date แล้วจึงแยกวิเคราะห์
เข้ารหัสด้วยสไตล์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.