Kịch bản gốc của bạn thực hiện như sau, từng dòng một:
@echo on
Báo cho dấu nhắc lệnh in lại từng lệnh trong tệp bó trước khi thực hiện chúng. Đây chỉ là để bạn có thể "nhìn thấy" những gì nó thực sự làm trước khi nó thực hiện.
cd "C:\Users\MVD21\Desktop\test"
C treo D irectory vào những gì tôi hy vọng là đường dẫn mà bạn muốn nén tất cả các tệp.
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
Tham số IN
ở đây là (C:\Users\MVD21\Desktop\test)
. Điều này sẽ khiến "thân" vòng lặp (hành động đằng sau từ khóa DO
) được thực thi chính xác một lần , với %i
tham số được gán giá trị C:\Users\MVD21\Desktop\test
. Không có gì ngạc nhiên khi điều này không làm những gì bạn muốn! Dường như điều này sẽ nén toàn bộ thư mục vào một tệp .7z.
Nếu nó không làm gì , có lẽ bởi vì nó không thể tìm thấy đường dẫn 7z.exe
. Nếu tệp đó không có trong thư mục hiện tại (thư mục đó test
được đề cập ở trên), thì nó sẽ phải nằm trên PATH
(trong %PATH%
biến môi trường; thử echo %PATH%
trong một vỏ để xem hiện tại nó được đặt thành gì). Nếu không, bạn phải sao chép 7z.exe
vào thư mục hiện tại hoặc chỉ định một đường dẫn tuyệt đối đến vị trí của nó (ví dụ như, chẳng hạn, "C:\Program Files\7-zip\7z.exe" ...
).
pause
Khi đoạn script kết thúc, từ khóa này chỉ báo cho shell chờ bạn nhấn enter hoặc đóng dấu nhắc lệnh thay vì thoát nó ngay lập tức.
Khi bạn đang xây dựng một tập lệnh bó (hoặc, thực sự, bất kỳ điều gì khác liên quan đến mã), bạn nên ngừng coi toàn bộ tập lệnh là một bản sao dán nguyên khối mà bạn không (cố gắng) hiểu và thay vào đó phá vỡ vấn đề thành các phần phụ mà bạn có thể tìm ra riêng lẻ, sau đó nối chúng lại với nhau. Điều này sẽ cho phép bạn giải quyết vấn đề một cách độc lập và tạo ra giải pháp thay vì yêu cầu người khác làm tất cả công việc cho bạn. Tôi khuyên bạn nên nó.
Trong trường hợp của bạn, bạn có các thành phần phụ sau của vấn đề của mình:
- Lặp lại (lặp qua) mỗi tệp có trong một thư mục nhất định.
- Đối với mỗi tệp đã cho, đặt tệp đó vào tệp .7z bằng cách gọi
7z
tiện ích.
Cơ hội để ai đó có câu trả lời ngoài đó đã giải quyết được nhu cầu cụ thể của bạn ít hơn cơ hội có thể tìm thấy những mảnh chung chung hơn.
Câu hỏi này, 'Cách làm một cái gì đó cho mỗi tệp trong một thư mục trong tập lệnh bó' giải quyết một nửa vấn đề của bạn.
Sức đẩy của câu trả lời là bạn chỉ cần bắt đầu với phần này từ câu trả lời StackOverflow đó:
for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f
và thay đổi phần mà nó đang làm một cái gì đó (cái echo %%f
) để làm những gì bạn muốn làm . Tôi biết rằng bạn cần thay đổi phần đó, vì tôi đã phân tích văn bản của tập lệnh và hiểu ý nghĩa của từng ký tự và tham số, vì vậy tôi có thể suy luận về nơi tôi muốn chèn mã của riêng mình.
Đây là một số "mã không khí" (chưa được kiểm tra!):
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~ni.7z" "%i"
Các câu lệnh @echo on
và pause
câu trên là cách thực hành tốt, vì vậy bạn có thể để chúng vào. Và có lẽ bạn cũng muốn giữ cd
câu lệnh đó, nếu các tệp của bạn nằm trong đường dẫn đó.
Vì vậy, những gì mà rời bỏ chúng ta?
@echo on
cd "C:\Users\MVD21\Desktop\test"
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~nf.7z" "%f"
pause
Nếu bạn trả lời với "Nó không hoạt động!", Tôi sẽ không giúp bạn. Nếu bạn thử cách này và nó không hoạt động, bạn PHẢI cho tôi biết trong các nhận xét thông tin sau:
- Thông báo lỗi chính xác nào bạn nhận được trong dấu nhắc lệnh khi bạn chạy các lệnh này hoặc đặt chúng trong một tệp bó và chạy chúng? Đừng viết tắt; sao chép và dán đầu ra trực tiếp (đặt nó trên http://pastebin.com nếu nó nhiều).
- Bạn nghĩ thông báo lỗi cho bạn biết vấn đề là gì?
- Cài đặt 7-zip của bạn nằm ở đâu (đường dẫn tệp)?
- Vị trí tệp của cài đặt 7-zip của bạn có được bao gồm trong nội dung của
PATH
biến môi trường không? (kiểm tra điều này, như đã đề cập ở trên, với echo %PATH%
một cmd
dấu nhắc.)