2013-04-29 30 views
9

Tôi đang viết tệp để xóa không gian khỏi tên tệp trong thư mục rồi đặt kết quả vào tệp .txt. Tôi chỉ nhận được kết quả của "Echo đang bật". hơn và hơn.Xóa dấu cách khỏi biến trong lô

Đây là những gì tôi có cho đến nay:

@echo ON 
SET LOCAL EnableDelayedExpansion 
For %%# in (*.*) do (
    SET var=%%~n# 
    Set MyVar=%var% 
    set MyVar=%MyVar: =% 
    echo %MyVar%>>text.txt 
) 

Ai đó có thể cho tôi biết whats sai?

+0

Bạn có gọi tệp lô là echo.bat/cmd không? – foxidrive

Trả lời

7

Lý do tại sao bạn đang nhận được ECHO is on. là vì trì hoãn việc mở rộng không được sử dụng, gây ra giá trị %var%%MyVar% được chèn trước khi lệnh for được chạy và vì chúng không được xác định lúc bắt đầu, các biến trống được chèn vào. Khi số echo %MyVar%>>text.txt được chạy, nó được hiểu là echo >>text.txt. Khi echo được chạy mà không có bất kỳ đối số nào, nó sẽ xuất ra cho dù echo đang bật hay tắt, đó là những gì bạn nhận được trong text.txt.

Để khắc phục sự cố, bạn phải làm hai việc:

Đầu tiên, có điều gì đó sai với dòng thứ hai của bạn. Không có khoảng trắng giữa bộ và địa phương ở số setlocal. Dòng thứ hai phải là SETLOCAL EnableDelayedExpansion.

Thứ hai, để sử dụng mở rộng trễ, bạn phải thay thế tất cả % s trong mỗi biến với !, như !var! thay vì %var%.

End kết quả:

@echo ON 
SETLOCAL EnableDelayedExpansion 
For %%# in (*.*) do (
    SET var=%%~n# 
    Set MyVar=!var! 
    set MyVar=!MyVar: =! 
    echo !MyVar!>>text.txt 
) 

Bạn thực sự không cần phải sử dụng một biến tạm thời trong trường hợp này, bạn chỉ có thể làm SET MyVar=%%~n# và skip to set MyVar=!MyVar: =!.

+0

Cảm ơn bạn, hoạt động hoàn hảo – user2313522

+0

@ user2313522 Thêm giải thích thêm .. – user2033427

0

Run đợt sau trong thư mục lưu trữ các file được đổi tên

@echo off 
    setlocal enabledelayedexpansion 
    for %%j in (*.*) do (
    set filename=%%~nj 
    set filename=!filename=.=_! 
    set filename=!filename= =_! 
    if not "!filename!"=="%%~nj" ren "%%j" "!filename!%%~xj" 
    ) 

bạn chỉ cần thêm bản in để txt

+2

mà chỉ cần loại bỏ tất cả các tên tập tin và để lại các phần mở rộng – user2313522

1

Điều sai lầm là bạn đã bật mở rộng biến (bạn đã viết xấu) ... và bạn cũng không sử dụng nó, khi bạn sử dụng mở rộng đã bật, bạn cần phải viết tên biến như sau:! thay vì điều này khác:% Variable%

Nhưng bạn không cần phải sử dụng nó với mã này:

@echo ON 
For %%# in (*) do (
    SET "var=%%~n#" 
    Call Set "MyVar=%%var: =%%" 
    Call echo %%MyVar%%>>text.txt 
) 
+0

Bộ gọi "MyVar = %% var: = %%" không hoạt động trong vòng lặp. – foxidrive

+0

@foxidrive, Nó hoạt động, xin lỗi nhưng ... bạn đã thử nghiệm nó trước khi bình luận ?. – ElektroStudios

+0

Sai lầm của tôi. Nó hoạt động tốt. – foxidrive

24

Loại bỏ tất cả các không gian (không chỉ ở đầu và đuôi) có thể được thực hiện mà không sử dụng setlocal enabledelayedexpansion với dòng sau:

set var=%var: =% 

Điều này hoạt động bằng cách thay thế tất cả dấu cách trong chuỗi bằng chuỗi rỗng.

Nguồn: DOS - String Manipulation

+0

Làm việc hoàn hảo khi tôi muốn xóa không gian giữa một chữ cái và một biến (ví dụ: "_p 011820181033" cần phải là "_p011820181033"). Cảm ơn! –

+0

Thủ thuật này cũng hợp lệ để thay thế các ký tự khác: chỉ cần đặt ký tự mong muốn để xóa thay vì dấu cách. Ví dụ, 'set var =% var:. =%' Sẽ loại bỏ tất cả các dấu chấm trong biến, điều này có thể hữu ích nếu bạn có một biến chứa số phiên bản có dấu chấm và bạn chỉ cần số. – Wayfarer

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