แก้ไขพา ธ สัมบูรณ์จากพา ธ สัมพัทธ์และ / หรือชื่อไฟล์


155

มีวิธีในสคริปต์แบทช์ของ Windows เพื่อส่งคืนพา ธ สัมบูรณ์จากค่าที่มีชื่อไฟล์และ / หรือเส้นทางสัมพัทธ์หรือไม่

ได้รับ:

"..\"
"..\somefile.txt"

ฉันต้องการพา ธ สัมบูรณ์ที่สัมพันธ์กับแบตช์ไฟล์

ตัวอย่าง:

  • "somefile.txt" ตั้งอยู่ใน "C: \ Foo \"
  • "test.bat" อยู่ใน "C: \ Foo \ Bar"
  • ผู้ใช้เปิดหน้าต่างคำสั่งใน "C: \ Foo" และการโทร Bar\test.bat ..\somefile.txt
  • ในแบตช์ไฟล์ "C: \ Foo \ somefile.txt" จะได้รับมาจาก %1

1
เส้นทางสัมพัทธ์ไม่ใช่จุดจบของเรื่องราว พิจารณาด้วยsymlinks ของ NTFS ด้วย : ส่วนใหญ่แล้วคุณจะต้องมี analog realpathเพื่อการทำให้เป็นมาตรฐานของ path ที่มีประสิทธิภาพ
ulidtko

อาจเป็นไปได้ว่าคุณไม่จำเป็นต้องมีเส้นทางที่แน่นอนเลย! คุณสามารถเพิ่มเส้นทางพื้นฐาน: SET FilePath=%CD%\%1เพื่อให้เป็นC:\Foo\Bar\..\..\some\other\dir\file.txtไปได้ โปรแกรมดูเหมือนจะเข้าใจเส้นทางที่ซับซ้อนเช่นนั้น
Fr0sT

จำนวนคำตอบเหล่านี้จะบ้าซับซ้อนมากกว่าหรือเพียงแค่รถธรรมดา - แต่นี้เป็นจริงเป็นสิ่งที่สวยง่ายที่จะทำในชุดจะดูที่คำตอบของฉันด้านล่าง
BrainSlugs83

คำตอบ:


160

ในไฟล์แบตช์เช่นเดียวกับในโปรแกรม C มาตรฐานอาร์กิวเมนต์ 0 มีเส้นทางไปยังสคริปต์ที่กำลังดำเนินการอยู่ในปัจจุบัน คุณสามารถใช้%~dp0เพื่อรับเฉพาะส่วนของเส้นทางของอาร์กิวเมนต์ 0 (ซึ่งเป็นสคริปต์ปัจจุบัน) - เส้นทางนี้เป็นเส้นทางที่ผ่านการรับรองโดยสมบูรณ์เสมอ

คุณยังสามารถรับพา ธ ที่ผ่านการรับรองโดยสมบูรณ์ของอาร์กิวเมนต์แรกของคุณโดยใช้%~f1แต่จะให้พา ธ ตามไดเรกทอรีการทำงานปัจจุบันซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณต้องการ

โดยส่วนตัวแล้วฉันมักจะใช้%~dp0%~1สำนวนในไฟล์แบทช์ซึ่งตีความอาร์กิวเมนต์แรกที่สัมพันธ์กับเส้นทางของแบตช์ที่ดำเนินการ มันมีข้อบกพร่องแม้ว่ามันจะล้มเหลวอย่างน่าสังเวชถ้าอาร์กิวเมนต์แรกมีคุณสมบัติครบถ้วน

หากคุณต้องการสนับสนุนทั้งเส้นทางสัมพัทธ์และเส้นทางสัมบูรณ์คุณสามารถใช้ประโยชน์จากโซลูชันของFrédéricMénez : เปลี่ยนไดเรกทอรีการทำงานปัจจุบันชั่วคราว

นี่คือตัวอย่างที่แสดงให้เห็นถึงเทคนิคเหล่านี้:

@echo off
echo %%~dp0 is "%~dp0"
echo %%0 is "%0"
echo %%~dpnx0 is "%~dpnx0"
echo %%~f1 is "%~f1"
echo %%~dp0%%~1 is "%~dp0%~1"

rem Temporarily change the current working directory, to retrieve a full path 
rem   to the first parameter
pushd .
cd %~dp0
echo batch-relative %%~f1 is "%~f1"
popd

หากคุณบันทึกสิ่งนี้เป็น c: \ temp \ example.bat และเรียกใช้จาก c: \ Users \ Public เป็น

c: \ Users \ Public> \ temp \ example.bat .. \ windows

... คุณจะสังเกตผลลัพธ์ต่อไปนี้:

%~dp0 is "C:\temp\"
%0 is "\temp\example.bat"
%~dpnx0 is "C:\temp\example.bat"
%~f1 is "C:\Users\windows"
%~dp0%~1 is "C:\temp\..\windows"
batch-relative %~f1 is "C:\Windows"

เอกสารสำหรับชุดตัวดัดแปลงที่ได้รับอนุญาตในอาร์กิวเมนต์ชุดสามารถดูได้ที่นี่: https://docs.microsoft.com/en-us/windows-server/administrator/windows-commands/call


4
คุณสามารถจัดการ%0และ%1เช่นเดียวกัน: %~dpnx0สำหรับพา ธ ที่ผ่านการรับรองโดยสมบูรณ์ + ชื่อของชุดไฟล์เอง%~dpnx1สำหรับพา ธ ที่ผ่านการรับรองโดยสมบูรณ์ + ชื่อของอาร์กิวเมนต์แรก [ถ้าเป็นชื่อไฟล์เลย] (แต่คุณจะตั้งชื่อไฟล์บนไดรฟ์อื่นได้อย่างไรถ้าคุณไม่ให้ข้อมูลเส้นทางแบบเต็มบน commandline ต่อไป?)
Kurt Pfeifle

ตัวอย่างนี้มีความซับซ้อนมากกว่าคำตอบ @ frédéric-ménez
srossross

3
สิ่งนี้ล้มเหลวในการเชื่อมโยงระบบไฟล์ NTFS
ulidtko

@KurtPfeifle d:\foo\..\bar\xyz.txtยังคงเป็นปกติได้ ฉันขอแนะนำให้ใช้วิธีนี้พร้อมกับคำตอบของ @ axel-heider ด้านล่าง (ใช้รูทีนย่อยแบบแบตช์ - จากนั้นคุณสามารถทำกับตัวแปรใด ๆ ไม่ใช่แค่ตัวแปรที่มีตัวเลข)
BrainSlugs83

@ulidtko คุณสามารถทำอย่างละเอียด? อะไรที่ล้มเหลว - คุณคาดหวังว่าจะเกิดอะไรขึ้น? - คุณคาดหวังที่จะแก้ไขโฟลเดอร์เดิมหรือไม่? (เพราะถ้าทำอย่างนั้นฉันจะเรียกว่าความล้มเหลว - มันเป็นจุดที่มีการเชื่อมโยงในตอนแรก ... )
BrainSlugs83

151

ฉันเจอความต้องการที่คล้ายกันเมื่อเช้านี้: วิธีการแปลงเส้นทางสัมพัทธ์เป็นเส้นทางที่แน่นอนภายในสคริปต์คำสั่งของ Windows

ต่อไปนี้เป็นเคล็ดลับ:

@echo off

set REL_PATH=..\..\
set ABS_PATH=

rem // Save current directory and change to target directory
pushd %REL_PATH%

rem // Save value of CD variable (current directory)
set ABS_PATH=%CD%

rem // Restore original directory
popd

echo Relative path: %REL_PATH%
echo Maps to path: %ABS_PATH%

2
มันมีประโยชน์จริงๆ มีแหล่งข้อมูลที่ดีสำหรับเทคนิคแฟ้มชุดงานเช่นนี้หรือไม่?
Danny Parker

8
อย่าคิดว่าจำเป็นต้องมี "pushd" ตามด้วย "cd" คุณสามารถทำ "pushd% REL_PATH%" ซึ่งจะบันทึกไดเรกทอรีปัจจุบันและเปลี่ยนเป็น REL_PATH ในครั้งเดียว
Eddie Sullivan

1
@DannyParker คอลเลกชันที่มีประโยชน์ของเทคนิคการแบทช์และสคริปต์ตัวอย่างคือrobvanderwoude.com/batchfiles.php ดูstackoverflow.com/questions/245395/…
hfs

6
@EddieSullivan หากเปลี่ยนเป็นไดเรกทอรีล้มเหลว (ไม่มีไดเรกทอรีไม่มีสิทธิ์ ... ) คำสั่ง pushd จะล้มเหลวเช่นกันและจะไม่ส่งค่าลงในไดเรกทอรีสแต็ก การโทรครั้งถัดไป (และการโทรติดต่อกันทั้งหมด) ไปยัง popd จะป๊อปอัปค่าที่ไม่ถูกต้อง การใช้pushd .ป้องกันปัญหานี้
SvenS

1
โปรดทราบว่าสิ่งนี้จะไม่ทำงานบนพา ธ ที่เป็นไฟล์หรือบนเส้นทางที่ไม่มีอยู่ซึ่งมี .. บางแห่งอยู่ตรงกลาง มันไม่ได้เป็นจุกสำหรับฉัน แต่มันเป็นจุดอ่อนนิดหน่อยกับโซลูชันที่ใช้ซ้ำได้
หมดเวลา Danila

97

คำตอบเหล่านี้ส่วนใหญ่ดูเหมือนจะบ้าไปกับสิ่งที่ซับซ้อนและมีความผิดพลาดสูงนี่คือของฉัน - มันทำงานได้กับตัวแปรสภาพแวดล้อมใด ๆ ไม่มี%CD%หรือPUSHD/ POPDหรือfor /fไร้สาระ - เพียงแค่ฟังก์ชั่นแบทช์เก่าแบบธรรมดา - ไดเรกทอรีและไฟล์ไม่จำเป็นต้องมีอยู่จริง

CALL :NORMALIZEPATH "..\..\..\foo\bar.txt"
SET BLAH=%RETVAL%

ECHO "%BLAH%"

:: ========== FUNCTIONS ==========
EXIT /B

:NORMALIZEPATH
  SET RETVAL=%~dpfn1
  EXIT /B

7
นี่เป็นวิธีการแก้ปัญหาที่สะอาดใช้งานได้และตรงไปตรงมา
Razvan

3
รัดกุมมาก ตอนนี้ฉันใช้เทคนิกอย่างกว้างขวาง
เปาโลFrança Lacerda

ทำไมถึงเป็น% ~ dpfn1 และไม่ใช่เพียงแค่% ~ f1 มันเป็นวิธีการแก้ปัญหาบางอย่าง? % ~ f1 ทำงานได้ดีสำหรับฉันบน windows 7 และ windows 10 อย่างน้อย
il - ya

1
@ il - ya ดูเหมือนว่า%~f1จะเป็นคำย่อ%~dpfn1- ดังนั้นโปรดใช้%~f1แทน 🙂 - ในรูปแบบยาว~หมายถึงลบเครื่องหมายคำพูด, dหมายถึงไดรฟ์, pหมายถึงเส้นทาง, nเพียงอย่างเดียวจะเป็นชื่อไฟล์ที่ไม่มีนามสกุล แต่fnหมายถึงชื่อไฟล์ที่มีนามสกุล 1หมายความว่าอาร์กิวเมนต์แรก - (ฉันเชื่อว่ารูปแบบนี้มีมาก่อน Windows 7)
BrainSlugs83

@ BrainSlugs83 ตัวแปรเหล่านี้มีให้บริการตั้งแต่ XP (เป็น cmd.exe) แต่การใช้งานไม่ได้เปลี่ยนแปลงตั้งแต่นั้น:% ~ f1 - ขยาย% 1 เป็นชื่อพา ธ แบบเต็ม % ~ d1 - ขยาย% 1 เป็นอักษรชื่อไดรฟ์เท่านั้น % ~ p1 - ขยาย% 1 ไปยังเส้นทางเท่านั้น % ~ n1 - ขยาย% 1 เป็นชื่อไฟล์เท่านั้น % ~ x1 - ขยาย% 1 เป็นนามสกุลไฟล์เท่านั้น ไม่มีกรณีพิเศษสำหรับ% ~ fn1, มันไม่ได้ผลิตชื่อ + นามสกุล, f สวิตซ์มีความสำคัญมากกว่า d, p, n และ x เมื่อรวมกัน ดูเหมือนจะไม่มีเหตุผลที่ดีสำหรับการเพิ่ม d, p และ n
il - ya

35

โดยไม่ต้องมีไฟล์แบตช์อื่นเพื่อส่งผ่านอาร์กิวเมนต์ไปยัง (และใช้ตัวดำเนินการอาร์กิวเมนต์) คุณสามารถใช้FOR /F:

FOR /F %%i IN ("..\relativePath") DO echo absolute path: %%~fi

ที่iในเป็นตัวแปรที่กำหนดไว้ใน%%~fi /F %%iเช่น. หากคุณเปลี่ยนสิ่ง/F %%aนั้นเป็นส่วนสุดท้ายก็จะเป็น%%~faเช่นนั้น

หากต้องการทำสิ่งเดียวกันที่พรอมต์คำสั่ง (และไม่ใช่ในไฟล์แบตช์) ให้แทนที่%%ด้วย%...


การไม่เปลี่ยนไดเรกทอรีเป็นสิ่งสำคัญเพราะมันทำให้สูตรมีความทนทานต่อความจริงที่ว่าcdคำสั่งไม่จำเป็นต้องเปลี่ยน%CD%ตัวแปรสภาพแวดล้อม (ถ้าเช่นคุณกำลังอยู่บนไดรฟ์D:และเส้นทางเป้าหมายของคุณเปิดอยู่C:)
jez

@jez สำหรับสิ่งที่คุณสามารถใช้cd /D D:\on.other.drive
เซบาสเตียน

FOR /F %%i IN ("..\relativePath") DO echo absolute path: %%~fiจะล้มเหลวหาก..\relativePathช่องว่างประกอบด้วย
Sebastian

1
มันทำงานได้เมื่อฉันลบแฟล็ก / F และใช้ %% ~ dpfnI โปรดทราบว่าfor /?แนะนำให้ใช้ตัวอักษรพิมพ์ใหญ่สำหรับชื่อตัวแปรเพื่อหลีกเลี่ยงความสับสนกับพารามิเตอร์การแทนที่
Sebastian

1
@SebastianGodelet การลบ/Fจะไม่ทำงานบนเส้นทางที่ไม่มีอยู่และจะแก้ไขอักขระตัวแทน หากคุณต้องการที่ดี แต่ถ้าคุณต้องการฟังก์ชั่นของ/Fคุณก็ต้องใช้tokensคำหลัก:FOR /F "tokens=*" %%I IN ("..\relative Path\*") DO echo absolute path: %%~fI
SvenS

15

นี่คือการช่วยเติมช่องว่างในคำตอบของ Adrien Plisson (ซึ่งควรได้รับการอัปเดตทันทีที่เขาแก้ไข ;-):

คุณสามารถรับพา ธ ที่ผ่านการรับรองโดยสมบูรณ์ของอาร์กิวเมนต์แรกของคุณโดยใช้% ~ f1 แต่สิ่งนี้จะให้เส้นทางตามเส้นทางปัจจุบันซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณต้องการ

น่าเสียดายที่ฉันไม่รู้วิธีผสม 2 อย่างเข้าด้วยกัน ...

หนึ่งสามารถจัดการ%0และ%1เช่นเดียวกัน:

  • %~dpnx0สำหรับไดรฟ์ที่มีคุณสมบัติครบถ้วนเส้นทาง + ชื่อ + ส่วนขยายของ batchfile ตัวเอง
    %~f0ก็พอเพียง;
  • %~dpnx1สำหรับไดรฟ์ที่มีคุณสมบัติครบถ้วน + พา ธ + ชื่อ + ส่วนขยายของอาร์กิวเมนต์แรก [ถ้าเป็นชื่อไฟล์เลย]
    %~f1ก็เพียงพอแล้ว

%~f1จะทำงานโดยอิสระจากวิธีที่คุณระบุอาร์กิวเมนต์แรกของคุณ: กับพา ธ สัมพัทธ์หรือพา ธ สัมบูรณ์ (หากคุณไม่ระบุนามสกุลของไฟล์เมื่อตั้งชื่อ%1มันจะไม่ถูกเพิ่มแม้ว่าคุณจะใช้%~dpnx1- อย่างไรก็ตาม

แต่คุณจะตั้งชื่อไฟล์บนไดรฟ์อื่นอย่างไรถ้าคุณไม่ให้ข้อมูลเส้นทางแบบเต็มบน commandline ในตอนแรก

อย่างไรก็ตาม%~p0, %~n0, %~nx0และ%~x0อาจจะมาในที่มีประโยชน์ที่คุณควรจะสนใจในเส้นทาง (ไม่ driveletter) ชื่อไฟล์ (ไม่มีนามสกุล) ชื่อไฟล์เต็มรูปแบบที่มีนามสกุลนามสกุลหรือชื่อไฟล์เท่านั้น แต่ทราบว่าในขณะที่%~p1และ%~n1จะทำงานเพื่อหาเส้นทางหรือชื่อของอาร์กิวเมนต์แรก%~nx1และ%~x1จะไม่เพิ่ม + แสดงส่วนขยายเว้นแต่คุณจะใช้มันใน commandline แล้ว


ปัญหาที่มี%~dpnx1ก็คือว่ามันจะช่วยให้เส้นทางครบถ้วนของการโต้แย้งเทียบกับไดเรกทอรีปัจจุบันขณะ OP ต้องการเส้นทางที่สัมพันธ์กับไดเรกทอรีที่อยู่แฟ้มชุด
Adrien Plisson

@Adrien Plisson: %~dpnx1ให้เส้นทางแบบเต็มของอาร์กิวเมนต์แรก ไม่สัมพันธ์เลยและไม่สัมพันธ์กับผบ. ปัจจุบัน dสำหรับไดรฟ์pสำหรับเส้นทางที่nเป็นชื่อไฟล์ซองต่อท้ายที่xเป็นคำต่อท้ายที่1เป็นอาร์กิวเมนต์แรก - และคำถามของนาธานคือ: "มีวิธีใดที่จะคืนค่าพา ธ สัมบูรณ์จากค่าที่มีชื่อไฟล์และ / หรือเส้นทางสัมพัทธ์ได้หรือไม่"
Kurt Pfeifle

ทั้งสองเส้นทางที่แน่นอนและญาติการใช้งานและแหล่งที่มีคำอธิบาย ชื่นชม!
it3xl

10

คุณสามารถใช้ฟังก์ชั่นแบบแบตช์สำหรับสิ่งนี้:

@echo off
setlocal 

goto MAIN
::-----------------------------------------------
:: "%~f2" get abs path of %~2. 
::"%~fs2" get abs path with short names of %~2.
:setAbsPath
  setlocal
  set __absPath=%~f2
  endlocal && set %1=%__absPath%
  goto :eof
::-----------------------------------------------

:MAIN
call :setAbsPath ABS_PATH ..\
echo %ABS_PATH%

endlocal

9

ปรับปรุงขนาดเล็กเพื่อแก้ปัญหาที่ดีเยี่ยมของ BrainSlugs83 ทั่วไปเพื่ออนุญาตให้ตั้งชื่อตัวแปรสภาวะแวดล้อมเอาต์พุตในการโทร

@echo off
setlocal EnableDelayedExpansion

rem Example input value.
set RelativePath=doc\build

rem Resolve path.
call :ResolvePath AbsolutePath %RelativePath%

rem Output result.
echo %AbsolutePath%

rem End.
exit /b

rem === Functions ===

rem Resolve path to absolute.
rem Param 1: Name of output variable.
rem Param 2: Path to resolve.
rem Return: Resolved absolute path.
:ResolvePath
    set %1=%~dpfn2
    exit /b

หากเรียกใช้จากC:\projectผลลัพธ์คือ:

C:\project\doc\build

4

ฉันไม่เห็นวิธีแก้ไขปัญหานี้มากมาย วิธีแก้ปัญหาบางอย่างใช้ประโยชน์จากการสำรวจเส้นทางโดยใช้ซีดีและอื่น ๆ ใช้ประโยชน์จากฟังก์ชั่นแบบกลุ่ม ความชอบส่วนตัวของฉันมีไว้สำหรับฟังก์ชั่นแบบแบตช์และโดยเฉพาะอย่างยิ่งฟังก์ชั่นMakeAbsoluteที่จัดทำโดย DosTips

ฟังก์ชั่นนี้มีประโยชน์บางประการเป็นหลักโดยที่ไม่เปลี่ยนแปลงไดเรกทอรีการทำงานปัจจุบันของคุณและอย่างที่สองที่เส้นทางที่ถูกประเมินไม่จำเป็นต้องมีอยู่ด้วยซ้ำ คุณสามารถอ่านเคล็ดลับที่มีประโยชน์เกี่ยวกับวิธีใช้ฟังก์ชันได้ที่นี่เช่นกัน

นี่คือตัวอย่างสคริปต์และผลลัพธ์:

@echo off

set scriptpath=%~dp0
set siblingfile=sibling.bat
set siblingfolder=sibling\
set fnwsfolder=folder name with spaces\
set descendantfolder=sibling\descendant\
set ancestorfolder=..\..\
set cousinfolder=..\uncle\cousin

call:MakeAbsolute siblingfile      "%scriptpath%"
call:MakeAbsolute siblingfolder    "%scriptpath%"
call:MakeAbsolute fnwsfolder       "%scriptpath%"
call:MakeAbsolute descendantfolder "%scriptpath%"
call:MakeAbsolute ancestorfolder   "%scriptpath%"
call:MakeAbsolute cousinfolder     "%scriptpath%"

echo scriptpath:       %scriptpath%
echo siblingfile:      %siblingfile%
echo siblingfolder:    %siblingfolder%
echo fnwsfolder:       %fnwsfolder%
echo descendantfolder: %descendantfolder%
echo ancestorfolder:   %ancestorfolder%
echo cousinfolder:     %cousinfolder%
GOTO:EOF

::----------------------------------------------------------------------------------
:: Function declarations
:: Handy to read http://www.dostips.com/DtTutoFunctions.php for how dos functions
:: work.
::----------------------------------------------------------------------------------
:MakeAbsolute file base -- makes a file name absolute considering a base path
::                      -- file [in,out] - variable with file name to be converted, or file name itself for result in stdout
::                      -- base [in,opt] - base path, leave blank for current directory
:$created 20060101 :$changed 20080219 :$categories Path
:$source http://www.dostips.com
SETLOCAL ENABLEDELAYEDEXPANSION
set "src=%~1"
if defined %1 set "src=!%~1!"
set "bas=%~2"
if not defined bas set "bas=%cd%"
for /f "tokens=*" %%a in ("%bas%.\%src%") do set "src=%%~fa"
( ENDLOCAL & REM RETURN VALUES
    IF defined %1 (SET %~1=%src%) ELSE ECHO.%src%
)
EXIT /b

และผลลัพธ์:

C:\Users\dayneo\Documents>myscript
scriptpath:       C:\Users\dayneo\Documents\
siblingfile:      C:\Users\dayneo\Documents\sibling.bat
siblingfolder:    C:\Users\dayneo\Documents\sibling\
fnwsfolder:       C:\Users\dayneo\Documents\folder name with spaces\
descendantfolder: C:\Users\dayneo\Documents\sibling\descendant\
ancestorfolder:   C:\Users\
cousinfolder:     C:\Users\dayneo\uncle\cousin

ฉันหวังว่าสิ่งนี้จะช่วย ... มันช่วยฉันได้แน่นอน :) PS ขอบคุณ DosTips อีกครั้ง! คุณร็อค!


ขอบคุณ @ulidtko ฉันไม่เคยลองใช้ symlink มาก่อน
dayneo

2

คุณสามารถต่อพวกมันให้ต่อกันได้

SET ABS_PATH=%~dp0 
SET REL_PATH=..\SomeFile.txt
SET COMBINED_PATH=%ABS_PATH%%REL_PATH%

มันดูแปลก ๆ กับ \ .. \ ที่อยู่กลางเส้นทางของคุณ แต่มันใช้ได้ ไม่ต้องทำอะไรบ้า ๆ :)


มันแค่ใช้งานได้ สามารถทำให้ง่ายขึ้นไปecho %~dp0..\SomeFile.txt
cowlinator

1

ในตัวอย่างของคุณจาก Bar \ test.bat DIR / B / S .. \ somefile.txt จะส่งคืนพา ธ เต็ม


นั่นไม่ใช่ความคิดที่ไม่ดี ... ฉันควรวนผลลัพธ์ของ DIR ด้วย FOR และเพิ่งคว้าผลลัพธ์แรกหรือไม่
Nathan Taylor

ฉันคิดถึงปัญหาเกี่ยวกับไฟล์หลายไฟล์ คุณไม่ได้ระบุว่าทวีคูณเป็นปัญหาหรือไม่ดังนั้นฉันจึงไปด้วย สำหรับวงวน FOR ฉันกำลังมีปัญหาในการป้อน "../" ไปยังวง for แต่ ymmv หากคุณไม่สามารถใช้คำสั่ง DIR ได้คุณอาจเปลี่ยนทิศทางเอาต์พุตไปยังไฟล์และวนซ้ำ ฉันไม่ได้บอกว่าวิธีการ 'แยก' ออกจากเส้นทางนั้นไม่ดีเพียงแค่ฉันคิดว่าของฉันทำสิ่งที่คุณถามมามากขึ้น วิธีแก้ปัญหาทั้งสองทำ 'บางสิ่ง' และทั้งคู่มีปัญหาของตัวเอง
George Sisco

โอ้ .. และถ้าคุณวนรอบ DIR สำเร็จคุณสามารถเขียนทับการเปลี่ยนเส้นทางไปยังไฟล์และรับผลลัพธ์สุดท้าย หากคุณกลับคำสั่งซื้อในลักษณะที่เป็นที่ยอมรับของคุณคุณจะได้รับเพียงผลลัพธ์แรก หากคุณต้องวนซ้ำไฟล์การกลับคำสั่งเพื่อให้ได้ผลลัพธ์แรกซึ่งจะอยู่ในตำแหน่งสุดท้ายอาจช่วยได้เช่นกัน เหตุผลที่ฉันแนะนำว่ามันอาจจะง่ายกว่าที่จะได้รับและทิ้งสิ่งต่าง ๆ มากมายแทนที่จะจัดการกับพวกเขา ฉันไม่รู้ว่าวิธีคิดของฉันเหมาะสมกับคุณหรือไม่ เพียงแค่วางไว้ที่นั่นเป็นความคิด
George Sisco

หากคุณต้องการทำให้เส้นทางไปยังโฟลเดอร์เป็นปกติฉันขอแนะนำวิธีแก้ไขปัญหานี้: stackoverflow.com/questions/48764076//
uceumern

0

PowerShell เป็นเรื่องธรรมดาในทุกวันนี้ดังนั้นฉันจึงใช้บ่อยครั้งเพื่อเรียกใช้ C # เนื่องจากมีฟังก์ชั่นสำหรับทุกสิ่งที่สวย

@echo off
set pathToResolve=%~dp0\..\SomeFile.txt
for /f "delims=" %%a in ('powershell -Command "[System.IO.Path]::GetFullPath( '%projectDirMc%' )"') do @set resolvedPath=%%a

echo Resolved path: %resolvedPath%

มันค่อนข้างช้า แต่ฟังก์ชั่นที่ได้รับนั้นยากที่จะเอาชนะเว้นแต่จะไม่มีการใช้ภาษาสคริปต์จริง


0

วิธีการแก้ปัญหาของ Stijn ทำงานร่วมกับโฟลเดอร์ย่อยภายใต้C:\Program Files (86)\,

@echo off
set projectDirMc=test.txt

for /f "delims=" %%a in ('powershell -Command "[System.IO.Path]::GetFullPath( '%projectDirMc%' )"') do @set resolvedPath=%%a

echo full path:    %resolvedPath%

0

ไฟล์ดูคำตอบอื่น ๆ ทั้งหมด

ไดเรกทอรี

ด้วย..การเป็นเส้นทางสัมพันธ์ของคุณและสมมติว่าคุณอยู่ในขณะนี้D:\Projects\EditorProject:

cd .. & cd & cd EditorProject (เส้นทางสัมพัทธ์)

ส่งคืนพา ธ สัมบูรณ์เช่น

D:\Projects


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.