2009-03-17 48 views
5

tôi nhận được một tập tin có chứa những điều sau đây:file Batch: Nhận đường dẫn tuyệt đối

\direcotry1\directory2\directory3\file1 
\direcotry1\file2 
\direcotry1\directory2\directory3\directory4\file3 
\direcotry1\file4 
\direcotry1\directory2\file5 
file6 

Lượng file trong file và số lượng các thư mục là biến.

Điều tôi cần chỉ là đường dẫn.

\direcotry1\directory2\directory3\ for file1 
\direcotry1\ for file2 
\direcotry1\directory2\directory3\directory4\ for file3 
\direcotry1\ for file4 
\direcotry1\directory2\ for file5 
and nothing for file6 

Tôi đã sử dụng biến %% ~ pi làm việc cho tất cả ngoại trừ biến cuối cùng. Đối với người cuối cùng, nó trả về \ cft \
Tôi đoán \ cft \ được trả về vì chương trình đang gọi tập tin bat khởi chạy nó từ đó.

FOR /F %%i in (test.txt) DO (
    echo %%~pi 
    command1 
    command2 
) 

Có ai biết cách tôi có thể tránh được tệp batfile trả về \ cft \? Tôi muốn con dơi trở lại không có gì khi không có con đường.

Cảm ơn rất nhiều trước sự giúp đỡ của bạn.

Trả lời

3

Sau khi thực hiện một số thử nghiệm, dường như "%%~pi" sẽ tiền tố thư mục hiện hành để mọi yếu tố mà không bắt đầu bằng "\".Tôi thu thập rằng nó giả định đây là trường hợp vì đó sẽ là tập tin bạn muốn mở nếu bạn chỉ sử dụng "tập tin" - tương tự "x \ y" sẽ là tập tin "\ x \ y".

Ví dụ, đoạn mã sau:

@echo off 
for /f %%i in (test.txt) DO (
    echo %%~pi 
) 

khi chạy trên các tập tin sau đây:

\directory1\directory2\directory3\file1 
\directory1\file2 
\directory1\directory2\directory3\directory4\file3 
\directory1\file4 
\directory1\directory2\file5 
file6 
x\y 
\z 

sẽ sản xuất (Tôi đang ở \ Documents and mục Settings \ Administrator):

\directory1\directory2\directory3\ 
\directory1\ 
\directory1\directory2\directory3\directory4\ 
\directory1\ 
\directory1\directory2\ 
\Documents and Settings\Administrator\ 
\Documents and Settings\Administrator\x\ 
\ 

Vì vậy, câu trả lời rất đơn giản. Phát hiện trước những dòng không bắt đầu bằng "\" và xử lý chúng một cách đặc biệt. Các kịch bản sau đây:

@echo off 
setlocal enableextensions enabledelayedexpansion 
for /f %%i in (test.txt) DO (
    set ch0=%%i 
    set ch0=!ch0:~0,1! 
    if not "!ch0!"=="\" (
     echo. 
    ) else (
     echo.%%~pi 
    ) 
) 
endlocal 

tạo đầu ra mong muốn của bạn, như sau:

\directory1\directory2\directory3\ 
\directory1\ 
\directory1\directory2\directory3\directory4\ 
\directory1\ 
\directory1\directory2\ 


\ 

các setlocal/endlocal là một cái gì đó tôi đặt trong hầu hết các kịch bản của tôi hiện nay vì nó ngăn ngừa các biến môi trường rò rỉ lên một cấp và việc mở rộng chậm trễ là tuyệt vời (sử dụng "!" thay vì "%").

Tôi sử dụng biến tạm thời ch0 để lấy ký tự đầu tiên của tệp ("!ch0:~0,1!" là toán tử chuỗi con, "lấy một ký tự ở độ lệch 0 của biến ch0" và bạn có thể sử dụng phiên bản "%" nếu bạn không làm chậm mở rộng).

Sau đó, tôi so sánh nó với "\". Nếu nó là một dấu gạch chéo, tôi echo các "%%~pi", nếu không tôi chỉ cần đầu ra một dòng trống theo spec của bạn.

+0

Tôi có thể sử dụng VÀ HOẶC theo lô như thế nào? nếu biến == 1 HOẶC biến == 2 ( command1 command2 ) –

+0

cảm ơn câu trả lời của bạn. Tôi đang thử nghiệm –

+0

Vì vậy, tôi muốn thử nếu không "! Ch0!" == "/" || "! ch0!" == "\" ( nhưng nó có vẻ không hoạt động –

0

Update2:

Như Lieven lưu ý, nếu bạn có thể thực thi mà tất cả mọi thứ bắt đầu với "\" trong tập tin test.txt của bạn, sau đó bạn có thể sử dụng mã này:

@echo off 
FOR /F %%i in (test.txt) DO (
    if not "%%~pi" == "\" echo %%~pi 
) 

Cập nhật :

Thực ra, sau khi đọc câu hỏi của bạn một lần nữa, tôi nhận thấy rằng những gì bạn cần là câu lệnh EXIST ..

FOR/F %% i in (test.txt) DO (nếu tồn tại %% i echo %% ~ pi command1 command2)

Đây có phải là những gì bạn cần không?

bài ban đầu của tôi ...

Khi bạn gọi tập tin thực thi, chỉ cần làm:

yourbatchfile.bat >nul 2>nul 

Bất cứ điều gì xảy đến stdout và stderr (màn hình hiển thị của bạn) sẽ được đường ống để không có nơi và không xuất hiện. Lưu ý rằng hoàn toàn không có gì sẽ được xuất ra từ tập tin thực thi đó ...

+0

Cách tiếp cận cập nhật của bạn sẽ không hoạt động nếu có tệp có tên là file6 trong đường dẫn thực tế. – schnaader

+0

Bạn nói đúng. Tôi đang thực hiện một bản cập nhật khác. –

0

Dường như điều này là do dấu gạch chéo ngược còn thiếu trước tập tin6.
Không thể thay đổi đầu vào của bạn để luôn có dấu gạch chéo ngược hàng đầu?

đầu vào của bạn sau đó sẽ trở thành

\directory1\directory2\directory3\file1 
\directory1\file2 
\directory1\directory2\directory3\directory4\file3 
\directory1\file4 
\directory1\directory2\file5 
\file6 
+0

tiếc là tôi không thể đặt dấu gạch chéo ngược hàng đầu. Đây là tệp đầu ra xuất phát từ máy chủ FTP. Tôi làm ví dụ như một bài kiểm tra dir * và nó trả về cho tôi một tệp có chứa tất cả các tệp bắt đầu bằng thử nghiệm. –

+0

@vesperdolphin - Tôi sẽ đi với phản ứng của schnaader sau đó. –

+0

Tôi có thể sử dụng VÀ HOẶC theo lô như thế nào? nếu biến == 1 HOẶC biến == 2 ( command1 command2 ) –

2

Bạn có thể lưu trữ các thư mục bạn muốn bỏ qua trong một biến:

FOR %%i in (file) do set ignoredir=%%~pi 
FOR /F %%i in (test.txt) DO (
    if not %%~pi == %ignoredir% echo %%~pi 
) 
set ignoredir= 

này hoạt động như mong đợi. Output:

\direcotry1\directory2\directory3\ 
\direcotry1\ 
\direcotry1\directory2\directory3\directory4\ 
\direcotry1\ 
\direcotry1\directory2\ 
+0

Xin chào những gì có trong hồ sơ? Đầu ra là biến vì vậy tôi không bao giờ biết trả trước thư mục nào tôi sẽ nhận được. –

+0

Lưu ý rằng FOR đầu tiên không đọc từ một tệp, nó chỉ phân tích thư mục cho chuỗi "tệp" (cũng có thể là "fsdjlkbfds") dẫn đến thư mục thực tế (là "\ cft \" trong trường hợp của bạn) vì vậy nó có thể bị bỏ qua sau đó. – schnaader

+0

+1. Hoạt động như mong đợi. –

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