2016-10-18 16 views
6

Tôi đã xem đoạn mã sau đây trên SuperUser, mục đích của việc này là thay thế biểu tượng của thư mục theo chương trình.Các dòng mã hàng loạt này là gì?

CD "%userprofile%\desktop" 
MKDIR "TEST FOLDER" 
ATTRIB +s "TEST FOLDER" 
CD "TEST FOLDER" 
COPY /Y "%userprofile%\desktop\image.ico" "./image.ico" 
ECHO [.ShellClassInfo] >> desktop.txt 
ECHO ConfirmFileOp=0 >> desktop.txt 
ECHO NoSharing=1 >> desktop.txt 
ECHO IconFile=image.ico >> desktop.txt 
ECHO IconIndex=0 >> desktop.txt 
ECHO InfoTip= >> desktop.txt 
CHCP 1252 >NUL 
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > desktop.ini 2>NUL 
CMD.EXE /D /U /C TYPE desktop.txt >> desktop.ini 
DEL /F /Q desktop.txt 
ATTRIB +S +H desktop.ini image.ico 

tôi nhận được phần còn lại của kịch bản một cách dễ dàng đủ, nhưng tôi đang gặp rắc rối tìm hiểu ba dòng:

CHCP 1252 >NUL 
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > desktop.ini 2>NUL 
CMD.EXE /D /U /C TYPE desktop.txt >> desktop.ini 

SS64 nói với tôi chcp 1252 có liên quan đến một cái gì đó gọi là "code page", 1252 tương ứng với "Tây Âu Latinh", do đó, tôi đoán tốt nhất là điều này buộc các kịch bản để sử dụng một bộ ký tự Latin. Hai dòng thứ hai mở các cá thể của CMD; SS64 cho biết công tắc/A trên đầu tiên làm cho đầu ra ở ANSI trong khi/U trên thứ hai làm cho nó xuất ra Unicode. Đó là về nhiều như tôi có thể suy đoán về, và tôi thực sự đánh giá cao nếu ai đó có thể đi qua từng phần chính của ba dòng này và cho tôi biết họ đang làm gì.

Cảm ơn!

+0

chcp thay đổi bảng mã của bàn phím: [đọc thêm] (http://www.computerhope.com/chcphlp.htm) và các dòng cmd thao tác trên desktop.ini – mtizziani

+3

@mtizziani: Các trang mã và bàn phím hoàn toàn không liên quan . 'CHCP' thay đổi cách diễn giải dữ liệu từ STDIN và đầu ra thành STDOUT của bàn điều khiển. – IInspectable

Trả lời

6

Nói tóm lại, các mã [1] :

  • tạo ra một tập tin tạm thời desktop.txtnội dung cuối cùng sẽ trở thành desktop.ini, nhưng với một mã hóa khác nhau.

  • các lệnh trong câu hỏi sau đó chuyển đổi dòng điện-console-bảng mã mã hóa tập tin desktop.txt (ví dụ, trên một hệ thống en-US, CP-437) để UTF-16 LE -encoded tập tin desktop.ini, đó là (văn hóa độc lập) tập tin file Explorer sử dụng để kiểm soát hiển thị thư mục trong tầm tay.

  • đặt system (+S) và hidden (+H) thuộc tính cho cả desktop.ini tập tin và các tập tin biểu tượng liên kết, image.ico, bởi vì đó là cách những tập tin này nên được đánh dấu (nếu họ chỉ kiểm soát hiển thị của chứa và không phải là tệp dữ liệu).

Cụ thể, 3 dòng quan tâm thực hiện như sau:

  • CHCP 1252 >NUL (âm thầm) thay đổi cho trang Windows-1252 mã.

  • CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > desktop.ini 2>NUL hiệu quả sẽ gửi chuỗi ÿþ đến tập tin đầu ra desktop.ini-ÿþ, khi giải thích như là một chuỗi -encoded Windows-1252, số tiền byte 0xFF 0xFE, đó là BOM (byte-trật tự dấu) được sử dụng để xác định UTF-16 LE file -encoded; nói cách khác: gửi chuỗi này đến tệp desktop.ini đánh dấu nó là tệp được mã hóa UTF-16 LE.

    • /D chỉ đơn giản là ngăn chặn bất kỳ chức năng tự động chạy mà có thể được xác định thông qua đăng ký
    • /A nói cmd.exe để đầu ra "ANSI" chuỗi -encoded, trong đó "ANSI" đề cập đến các bảng mã mặc định - mà hiện nay được thiết lập đến Windows-1252
    • /C có nghĩa là các đối số sau đây sẽ được thực hiện dưới dạng lệnh và rằng cmd.exe sẽ thoát sau khi lệnh kết thúc.
  • CMD.EXE /D /U /C TYPE desktop.txt >> desktop.ini sau đó gắn các nội dung của tạo trước desktop.txt tập tin để desktop.ini, sử dụng "Unicode" (UTF-16 LE) mã hóa (nhờ /U), trong đó hoàn thành việc chuyển đổi tập tin tạm thời desktop.txt-UTF-16 LE -encoded desktop.ini (sau đó desktop.txt bị xóa).


[1]
Câu trả lời này giải thích của mã ý định, đó không có nghĩa là nó nhất thiết làm việc, đặc biệt là trong Windows 10; Ví dụ, một cách tương tác gán một biểu tượng dường như để thiết lập một khác nhau, đơn tài sản đó kết hợp các tập tin hình ảnh và chỉ số tài nguyên nội bộ cụ thể của nó: ví dụ, IconResource=C:\Users\jdoe\Desktop\image.ico,0

Đối với sự cần thiết phải tạo UTF-16 LE file -encoded : nó không phải là một yêu cầu nghiêm ngặt - rõ ràng, bản thân Windows, khi bạn sử dụng File Explorer để gán một biểu tượng, tạo các tệp trong hiện tại - mã hóa một byte (ví dụ: Windows-1252).
Điều đó nói rằng, sử dụng mã hóa độc lập với văn hóa chẳng hạn như UTF-16 LE ít nhất là về phương diện tiếp cận mạnh mẽ nhất.
Tuy nhiên, nếu tất cả các giá trị bạn đang viết cho desktop.ini là các ký tự chỉ có ASCII (phạm vi 7 bit), thì chỉ cần nhập trực tiếp echo đường thẳng vào desktop.ini trực tiếp.

Vào cuối ngày, sử dụng một tập tin batch để xác định các thuộc tính hiển thị thư mục là một cách tiếp cận mong manh, cho rằng nó chủ yếu được dựa trên ngược-kỹ thuật API chính thức - có thể thay đổi.

Nói chung, sử dụng các tệp lô để làm mọi thứ là tốt nhất nên tránh những ngày này - thay vào đó hãy sử dụng PowerShell.

+0

Cảm ơn các chi tiết. Có một mục đích để tất cả các messing xung quanh với việc tạo ra một tập tin văn bản tạm thời đầu tiên, và sau đó chuyển đổi đó để 'UTF-16' mã hóa? Nó có vẻ thực sự phức tạp. Có thể đơn giản hóa nó không? Liệu các .ini cần phải được mã hóa trong 'UTF-16' ở tất cả - bạn có thể không tạo tập tin trực tiếp và chỉ cần thêm các thuộc tính' system' và 'hidden'? – Hashim

+0

@Hashim: Vui lòng xem cập nhật của tôi. Tôi sợ rằng tôi sẽ từ bỏ việc đi sâu hơn vào hố thỏ này ... – mklement0

+0

Haha, điều đó đủ công bằng, đó là một câu trả lời rất kỹ lưỡng. Tôi vẫn có thêm câu hỏi, và có lẽ nhiều hơn sau khi những người được trả lời - đây có vẻ là một trong những lĩnh vực mà mỗi câu trả lời sẽ trả về thêm 2 câu hỏi cho tôi, có lẽ không được giúp đỡ bởi sự thiếu nền tảng trong bức tranh lớn. dễ bị lạc vào những lỗ thỏ của câu hỏi. Cảm ơn rất nhiều. – Hashim

Các vấn đề liên quan