2010-03-07 32 views
12

Tôi cần phải tìm tên của thư mục cha cho một tập tin trong DOSNhận tên thư mục cha cho một tập tin đặc biệt sử dụng hệ điều hành DOS Batch scripting

cho ex.

Giả sử đây là thư mục

C:\test\pack\a.txt 

Tôi có một kịch bản mà hỏi tôi tên tập tin

C:\\>getname.bat  
enter file name: c:\test\pack\a.txt 

nay là kịch bản phải trả lại chỉ là tên mẹ của tập tin.

pack   

và KHÔNG phải toàn bộ đường dẫn gốc đến tệp.

c:\test\pack 

Trả lời

9

thấy this câu hỏi

@echo OFF 
set mydir="%~p1" 
SET mydir=%mydir:\=;% 

for /F "tokens=* delims=;" %%i IN (%mydir%) DO call :LAST_FOLDER %%i 
goto :EOF 

:LAST_FOLDER 
if "%1"=="" (
    @echo %LAST% 
    goto :EOF 
) 

set LAST=%1 
SHIFT 

goto :LAST_FOLDER
+0

Cảm ơn bạn .. U r thiên tài :) .. hoạt động hoàn hảo –

+0

Tôi không thấy cách thức hoạt động. % ~ p1 không hoạt động đối với tôi. Nó chỉ hoạt động với% ~ dp0 hoặc% ~ p0. – djangofan

+0

@djangofan Tập lệnh lấy một đường dẫn làm đối số và trả về tên thư mục của đường dẫn. – asdfg

1

bạn có thể sử dụng một VBScript, ví dụ như tiết kiệm dưới đây là getpath.vbs

Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objArgs = WScript.Arguments 
strFile = objArgs(0) 
WScript.Echo objFS.GetParentFolderName(strFile) 

sau đó trên dòng lệnh hoặc trong bó, làm được điều này

C:\test>cscript //nologo getpath.vbs c:\test\pack\a.txt 
c:\test\pack 

Nếu bạn muốn một phương pháp lô, bạn có thể xem for /?.

%~fI  - expands %I to a fully qualified path name 
    %~dI  - expands %I to a drive letter only 
    %~pI  - expands %I to a path only 
10

Câu trả lời đầu tiên ở trên không có tác dụng nếu tên thư mục mẹ chứa khoảng trắng. Các công trình sau đây:

@echo off 
setlocal 

set ParentDir=%~p1 
set ParentDir=%ParentDir: =:% 
set ParentDir=%ParentDir:\= % 
call :getparentdir %ParentDir% 
set ParentDir=%ParentDir::= % 

echo ParentDir is %ParentDir% 
goto :EOF 

:getparentdir 
if "%~1" EQU "" goto :EOF 
Set ParentDir=%~1 
shift 
goto :getparentdir 

Gọi trên với tham số của "C: Dir \ Temp \ Chánh Với Space \ myfile.txt" cho sau:

>GetParentDir "C:\Temp\Parent Dir With Space\myfile.txt" 
ParentDir is Parent Dir With Space 

Các công trình trên bằng cách thay thế không gian với dấu hai chấm (những điều này không nên tồn tại trong các đường dẫn Windows), sau đó thay thế các dấu phân cách thư mục bằng dấu cách để các thư mục riêng lẻ được chuyển tới getparentdir như các đối số riêng biệt. Hàm getparentdir lặp lại cho đến khi nó tìm ra đối số cuối cùng của nó. Cuối cùng, bất kỳ dấu hai chấm nào trong kết quả đều được thay thế bằng dấu cách.

+0

có thể thực hiện công việc này cho tên tệp bao gồm dấu phẩy không? trường hợp đặc biệt tôi biết, chỉ cần tự hỏi nếu nó sẽ là một bổ sung đơn giản hoặc rất nhiều mã phụ. cảm ơn – GeorgeCostanza

1

Đây là cách không sử dụng CALL và tôi tin là nhanh hơn.Based on jeb's splitting function (có thể thất bại nếu tên thư mục chứa !):

@echo off 

set "mydir=%~p1" 
SET mydir=%mydir:~0,-1% 

setlocal EnableDelayedExpansion 
set LF=^ 


rem ** Two empty lines are required 

for %%L in ("!LF!") DO (
    set "dir_name=!mydir:\=%%L!" 
) 
for /f "delims=" %%P in (""!dir_name!"") do set "dn=%%~P" 
echo %dn% 

exit /b 0 
+0

hoạt động tuyệt vời này. là có một cách đơn giản để thêm các trường hợp đặc biệt cho các dấu chấm than, vv, hoặc là kịch bản DOS quá giới hạn? – GeorgeCostanza

0

Dưới đây là một giải pháp:

SET LAST=%CD% 
SET PARENTNAME=NONE 
cd /D C:\test\pack 
FOR %%I in (%CD%) do SET PARENTNAME=%%~nI 
cd /D %LAST% 
ECHO %PARENTNAME% 

%% ~ Ni: '~ n' trích xuất tên từ đường dẫn lưu trữ trong %% tôi biến
cd: '/ D' tham số bổ sung để chuyển đổi giữa đĩa cũng

1

tôi tìm thấy sự kết hợp của cách tiếp cận từ các câu trả lời của djangofan và hoang tưởng là cả hai, đơn giản và hoàn hảo s ufficient, khi nhìn lên thư mục cha kịch bản của tôi:

set FULL_PATH=%~dp0 
set FULL_PATH=%FULL_PATH:~1,-1% 
for %%i in ("%FULL_PATH%") do set "PARENT_FOLDER=%%~ni" 
echo %PARENT_FOLDER% 

Vì bạn muốn làm việc trên người dùng nhập vào thay vào đó, bạn phải làm một số công việc bổ sung tối thiểu, để xử lý các biến pháp luật như C: \ foo \ bar \ a. txt so với C: \ foo \ bar \ a.txt hoặc c: /foo/bar/a.txt. sau đó điều này có thể làm việc cho bạn:

@setlocal 
@echo off 

call:GET_PARENT_FOLDER C:\foo\bar\a.txt 
echo %PARENT_FOLDER% 
call:GET_PARENT_FOLDER C:\foo\bar\\a.txt 
echo %PARENT_FOLDER% 
call:GET_PARENT_FOLDER c:/foo/bar/a.txt 
echo %PARENT_FOLDER% 

pause 
goto:EOF 

:GET_PARENT_FOLDER 
:: Strip the filename, so we get something like this: 'C:\foor\bar\' 
set "_FULL_PATH=%~dp1" 

:: Strips all dangling '\' and '/' in a loop, so the last folder name becomes accessible 
:_STRIP 
if not "%_FULL_PATH:~-1%"=="\" if not "%_FULL_PATH:~-1%"=="/" goto:_STRIP_END 
set "_FULL_PATH=%_FULL_PATH:~1,-1%" 
goto:_STRIP 
:_STRIP_END 

:: We need the context of a for-loop for the special path operators to be available 
for %%i in ("%_FULL_PATH%") do set "PARENT_FOLDER=%%~ni" 

goto:EOF 
7

Nó có thể rất đơn giản để có được thư mục mẹ của tập tin batch:

@echo off 
for %%a in ("%~dp0\.") do set "parent=%%~nxa" 
echo %parent% 

Và đối với một phụ huynh của một đường dẫn tập tin theo các câu hỏi:

@echo off 
for %%a in ("c:\test\pack\a.txt") do for %%b in ("%%~dpa\.") do set "parent=%%~nxb" 
echo %parent% 
+0

Tôi thấy điều này hữu ích cho việc tìm kiếm một thư mục mẹ là một cặp thư mục phía trên tập tin thực thi. Chỉ cần thêm '\ ..' sau '% ~ dp0 \ .' để tăng cấp độ thư mục. Ví dụ: 'cho %% a in ("% ~ dp0 \. \ .. \ .. \ .. ") đặt" parent = %% ~ nxa "' – Toomaja

1

Ý tưởng về DaDummy hoạt động trong các chức năng có thể sử dụng lại thực tế hơn. Ngoài ra, ký tự đầu tiên của _full_path hiện được bao gồm.

set map=D:\test1\test2\test3\test4.txt 
call:get_parent_path "%map%" 
echo full_path is %_full_path% 
call:get_parent_path %_full_path% 
echo full_path is %_full_path% 
call:get_last_path %_full_path% 
echo last_path is %_last_path% 
goto :eof 

:get_parent_path 
set "_full_path=%~dp1" 
:_strip 
if not "%_full_path:~-1%"=="\" if not "%_full_path:~-1%"=="/" goto:_strip_end 
set "_full_path=%_full_path:~0,-1%" 
goto:_strip 
:_strip_end 
exit /b 

:get_last_path 
set "_last_path=%~nx1" 
exit /b 

::result: 
::full_path is D:\test1\test2\test3 
::full_path is D:\test1\test2 
::last_path is test2 
Các vấn đề liên quan