![](/img/trans.png)
[英]How do I conditionally turn @ECHO ON/OFF in a Windows batch file?
[英]How do I get a relative path out of a windows batch file using echo?
如何獲取相對目錄/部分路徑以顯示為Windows .bat文件的回顯輸出?
談論一切,但是。
我發現驅動器號,文件名,擴展名,簡稱(8.3)和完整路徑-但沒有相對路徑。
我正在運行遞歸FOR /R
循環; 遍歷子目錄。 我想要一些-沒有二十個字符的無用路徑信息-告訴我每個重復文件都位於哪個目錄中...而無需將.bat文件硬編碼為位於某個目錄/路徑中?
也許一種解決方案是測量腳本路徑的長度並將其從完整路徑的開頭截斷? 但是我不知道該如何操作。
腳本可能在很多地方:
F:\a.bat<BR>
F:\Dir1\fileA.txt<BR>
F:\Dir20\fileA.txt
C:\Users\Longusername\Desktop\Container\a.bat<BR>
C:\Users\Longusername\Desktop\Container\Dir1\fileA<BR>
C:\Users\Longusername\Desktop\Container\Dir20\fileA
現在,我僅有的輸出選項是( %%~nxG
):
fileA.txt
fileA.txt
哪個不告訴我每個文件位於哪個目錄...或( %%~pnxG
)
\Users\Longusername\Desktop\Container\Dir1\fileA.txt
\Users\Longusername\Desktop\Container\Dir20\fileA.txt
我想要的,從任何位置:
\Dir1\fileA.txt
\Dir20\fileA.txt
可能缺少前導\\
,但這可以忽略不計。 如果它們可以在大多數窗口計算機上使用,則允許使用echo以外的其他選項。 但是,它們可能會引發更多問題-正如我用回聲找出的其他部分一樣。
考慮一下,這很容易:只需刪除當前目錄路徑( %cd%
):
@echo off
setlocal enabledelayedexpansion
for /r %%a in (*.txt) do (
set "x=%%a"
echo with \: !x:%cd%\=\!
echo without \: !x:%cd%\=!
)
順便說一句: \\folder\\file
總是指驅動器的根目錄( x:\\folder\\file
),因此它並不是一個相對路徑。
這類似於已經接受的答案,但是僅在需要時才啟用延遲擴展。 這應該正確輸出包含!
文件名!
字符。
@Echo Off
SetLocal DisableDelayedExpansion
Set "TopLevel=C:\Users\LongUserName"
For /R "%TopLevel%" %%A In ("*.txt") Do (
Set "_=%%A"
SetLocal EnableDelayedExpansion
Echo=!_:*%TopLevel%=!
EndLocal
)
Pause
您還可以使用Set "TopLevel=%~dp0"
(運行腳本的目錄)或Set "TopLevel=%~dp0.."
(運行腳本的父目錄)
%TopLevel%
的值(在這種情況下, 根據最初的示例 ,當前目錄將為C:\\Users
) :
Set "TopLevel=LongUserName"
盡管只有在樹中較早的路徑的內容中不存在LongUserName
此方法才能正常工作。
您可以將xcopy
與其/S
(包括子目錄)和/L
(列出但不復制)選項一起使用,因為它會返回相對路徑,因此您不必進行任何字符串操作,有時可能會有點麻煩危險,特別是當當前目錄是驅動器的根目錄時:
xcopy /L /S /I /Y /R ".\*.txt" "\" | find ".\"
附加的find
命令構成一個過濾器,該過濾器從輸出中除去摘要行# File(s)
。
要捕獲上述命令行的輸出,只需使用for /F
循環 :
for /F "delims=" %%I in ('
xcopy /L /S /I /Y /R ".\*.txt" "\" ^| find ".\"
') do (
rem // Do something with each item:
echo/%%I
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.