আপেক্ষিক পথ এবং / অথবা ফাইলের নাম থেকে নিখুঁত পথটি সমাধান করুন


155

উইন্ডোজ ব্যাচের স্ক্রিপ্টে কোনও ফাইল নাম এবং / অথবা আপেক্ষিক পাথ সম্বলিত মান থেকে নিখুঁত পথ ফেরানোর কোনও উপায় আছে?

প্রদত্ত:

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

ব্যাচ ফাইলের সাথে সম্পর্কিত আমার নিখুঁত পাথ দরকার।

উদাহরণ:

  • "somefile.txt" "সি: oo ফু \" এ অবস্থিত
  • "টেস্ট.বাট" "সি: oo ফু \ বার" এ অবস্থিত।
  • ব্যবহারকারী "সি: \ ফু"-তে একটি কমান্ড উইন্ডো খোলে এবং কল করে Bar\test.bat ..\somefile.txt
  • ব্যাচ ফাইলটিতে "সি: oo ফু \ somefile.txt" থেকে নেওয়া হবে %1

1
আপেক্ষিক পথগুলি গল্পের শেষ নয়। এনটিএফএস সিমলিংকগুলিও বিবেচনা করুন : সম্ভবত আপনার realpathশক্তিশালী পাথের স্বাভাবিককরণের জন্য একটি এনালগও প্রয়োজন ।
ulidtko

সম্ভবত আপনার কোনও সঠিক পাথের দরকার নেই! আপনি কেবল একটি বেস পাথ যুক্ত করতে পারেন: SET FilePath=%CD%\%1যাতে এটির মতো হতে পারে C:\Foo\Bar\..\..\some\other\dir\file.txt। প্রোগ্রামগুলি মনে হয় এমন জটিল পথটি বোঝে।
Fr0sT

এই উত্তরগুলির অনেকগুলি জটিল, বা কেবল সরল বগির চেয়ে ক্রেজি but তবে, এটি আসলে ব্যাচের মধ্যে করা খুব সহজ কাজ, নীচের আমার উত্তরটি একবার দেখুন
BrainSlugs83

উত্তর:


160

ব্যাচ ফাইলগুলিতে, স্ট্যান্ডার্ড সি প্রোগ্রামগুলির মতো, আর্গুমেন্ট 0 এ বর্তমানে কার্যকর স্ক্রিপ্টের পথ রয়েছে। আপনি ০ %~dp0র্থ আর্গুমেন্টের (যা বর্তমান স্ক্রিপ্ট) কেবলমাত্র পাথ অংশটি পেতে ব্যবহার করতে পারেন - এই পথটি সর্বদা একটি সম্পূর্ণরূপে যোগ্য পথ।

আপনি ব্যবহার করে আপনার প্রথম যুক্তির পুরোপুরি যোগ্যতাসম্পন্ন পাথ পেতে পারেন %~f1, তবে এটি বর্তমান কার্যনির্বাহী ডিরেক্টরি অনুসারে একটি পথ দেয় যা আপনি যা চান তা স্পষ্টতই নয়।

ব্যক্তিগতভাবে, আমি প্রায়শই %~dp0%~1আমার ব্যাচ ফাইলে আইডিয়ামটি ব্যবহার করি যা নির্বাহী ব্যাচের পথের সাথে সম্পর্কিত প্রথম যুক্তিকে ব্যাখ্যা করে। যদিও এর কোনও অসুবিধা নেই: প্রথম যুক্তি পুরোপুরি দক্ষ হলে এটি খারাপভাবে ব্যর্থ হয়।

আপনার যদি আপেক্ষিক এবং নিখুঁত উভয় পাথ সমর্থন করার প্রয়োজন হয় তবে আপনি ফ্রেডেরিক মেনেজের সমাধানটি ব্যবহার করতে পারেন : অস্থায়ীভাবে বর্তমান চলমান ডিরেক্টরিটি পরিবর্তন করুন।

এখানে একটি উদাহরণ যা এই প্রতিটি কৌশল প্রদর্শন করবে:

@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

যদি আপনি এটি সি: \ অস্থায়ী \ উদাহরণ হিসাবে সংরক্ষণ করেন। উদাহরণস্বরূপ এবং এটি সি থেকে চালান: \ ব্যবহারকারী \ হিসাবে সর্বজনীন

সি: \ ব্যবহারকারী \ পাবলিক> \ টেম্প \ উদাহরণ.bat .. \ উইন্ডোজ

... আপনি নিম্নলিখিত আউটপুট পর্যবেক্ষণ করবেন:

%~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/administration/windows-commands/call


4
আপনি হ্যান্ডেল করতে পারেন %0এবং তেমনিভাবে %1: %~dpnx0পুরোপুরি যোগ্য পাথের জন্য + ব্যাচফাইলে নিজেই নাম, %~dpnx1সম্পূর্ণরূপে যোগ্য পাথের জন্য + এর প্রথম যুক্তির নাম [যদি সে কোনও ফাইলের নামই থাকে]। (তবে আপনি যদি কোনওভাবে কমান্ডলাইনে সেই পুরো পথের তথ্য না দিয়ে থাকেন তবে কীভাবে আপনি পৃথক ড্রাইভে একটি ফাইলের নাম রাখবেন?)
কুর্ট ফেফেল

এই উদাহরণটি @ ফ্রিড্রিক-মনেজ উত্তরের চেয়ে অনেক জটিল
সারসক্রস

3
এটি এনটিএফএস সিমলিংকে ব্যর্থ।
ulidtko

@ কুর্টফিফেল d:\foo\..\bar\xyz.txtএখনও সাধারণ করা যায়। আমি নীচে @ অ্যাকেল-হাইডারের উত্তরের সাথে এই পদ্ধতিটি ব্যবহার করার পরামর্শ দিচ্ছি (একটি ব্যাচ সাব্রোটিন ব্যবহার করে - তবে আপনি এটি কেবল একটি সংখ্যাযুক্ত ভেরিয়েবল নয়, কোনও ভেরিয়েবলে করতে পারেন)।
BrainSlugs83

@ulidtko আপনি কি বিস্তারিত বলতে পারবেন? কী ব্যর্থ? - আপনি কি ঘটতে প্রত্যাশা করছেন? - আপনি কি মূল ফোল্ডারটি সমাধান করার আশা করছেন? (কারণ যদি তা যে , আমি কল করবে যে একটি ব্যর্থতা - এটা প্রথম স্থানে symlinks থাকার বিন্দু ধরনের ...)
BrainSlugs83

151

আমি আজ সকালে একই রকম প্রয়োজনটি পেলাম: কীভাবে কোনও উইন্ডোজ কমান্ড স্ক্রিপ্টের মধ্যে কোনও আপেক্ষিক পাথকে একটি পরম পথে রূপান্তর করতে হয়।

নিম্নলিখিতটি কৌশলটি করেছে:

@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
এটি সত্যিই দরকারী। ব্যাচ ফাইল ট্রিকস এর মতো কোনও ভাল সংস্থান আছে কি?
ড্যানি পার্কার

8
"সিডি" এর পরে "পুশড" থাকা দরকার বলে মনে করবেন না। আপনি কেবল "পুশ% REL_PATH%" করতে পারেন। এটি বর্তমান ডিরেক্টরিটি সংরক্ষণ করবে এবং একসাথে REL_PATH এ স্যুইচ করবে।
এডি সুলিভান

1
@ ড্যানিপার্কার ব্যাচ কৌশল এবং উদাহরণ স্ক্রিপ্টগুলির একটি দরকারী সংগ্রহ হ'ল রবভ্যান্ডারউউড . com/batchfiles.php । আরও দেখুন stackoverflow.com/questions/245395/...
HFS

6
@ এডি সুলিভান ডিরেক্টরিতে পরিবর্তন করা যদি ব্যর্থ হয় (ডিরেক্টরি উপস্থিত নেই, অনুমতি নেই ...), পুশ কমান্ডটিও ব্যর্থ হয় এবং প্রকৃতপক্ষে ডিরেক্টরি স্ট্যাকের উপরে কোনও মান চাপায় না। পরের কল (এবং সমস্ত পরপর কল) পপডে ভুল মানটি পপ করবে। ব্যবহার করা pushd .এই সমস্যাটিকে প্রতিরোধ করে ।
সোভেনস

1
মনে রাখবেন যে এটি ফাইলগুলিতে বা অস্তিত্বহীন পাথগুলিতে কাজ করবে না যেখানে মাঝখানে কোথাও আছে .. এটি আমার পক্ষে শো স্টপার ছিল না, তবে এটি পুনরায় ব্যবহারযোগ্য সমাধানের জন্য কিছুটা দুর্বলতা।
মিহাই ডানিলা

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
এটি প্রকৃতপক্ষে একটি পরিষ্কার, কর্মক্ষম এবং সোজা সমাধান।
রাজওয়ান

3
খুব সংক্ষিপ্ত আমি এখন এই টেকনিকটি ব্যাপকভাবে ব্যবহার করছি।
পাওলো ফ্রান্সিয়া লেসারদা

কেন এটি% ~ dpfn1 এবং কেবল% ~ f1 নয়? এটা কি একরকম কাজ? % ~ f1 কমপক্ষে উইন্ডোজ 7 এবং উইন্ডোজ 10 এ আমার জন্য ভাল কাজ করে।
ইল - ইয়া

1
@ ইল - ইয়া দেখে মনে হচ্ছে এটির %~f1জন্য খুব কম %~dpfn1- সুতরাং, %~f1পরিবর্তে ব্যবহার করতে নির্দ্বিধায় । 🙂 - দীর্ঘ ফর্ম্যাটে ~মানে কোটগুলি মুছে ফেলা, dযার অর্থ ড্রাইভ, pঅর্থ পথ, nএকা কোনও এক্সটেনশন ছাড়াই ফাইলের নাম হবে, তবে এর fnঅর্থ এক্সটেনশন সহ ফাইলের নাম। 1প্রথম আর্গুমেন্ট মানে। - (আমি বিশ্বাস করি এই ফর্ম্যাটটি উইন্ডোজ 7. এর পূর্বে রয়েছে))
ব্রেইনস্লাগস ৩৩

@ BrainSlugs83 এই ভেরিয়েবলগুলি এক্সপি (সেমিডি.এক্স.ই.এস.) থেকে পাওয়া যায়, তবে এর পরে তাদের ব্যবহার পরিবর্তন হয়নি:% ~ f1 -% 1 সম্পূর্ণরূপে যোগ্য পাথের নামে প্রসারিত হয়; % ~ d1 -% 1 কেবলমাত্র ড্রাইভ লেটারে প্রসারিত করে; % ~ p1 -% 1 কেবল একটি পথে প্রসারিত করে; %; n1 -% 1 কেবল একটি ফাইলের নামে প্রসারিত হয়; %। x1 -% 1 কেবল একটি ফাইল এক্সটেনশনে প্রসারিত। % ~ Fn1 এর জন্য কোনও বিশেষ কেস নেই, এটি নাম + এক্সটেনশন তৈরি করে না, এফ স্যুইচটি কেবল একত্রিত হওয়ার পরে d, p, n এবং x এর চেয়ে বেশি অগ্রাধিকার নেয়। ডি, পি এবং এন যুক্ত করার কোনও ভাল কারণ নেই বলে মনে হয়।
ইল - ইয়া

35

(এবং আর্গুমেন্ট অপারেটরগুলি ব্যবহার করে) এর পক্ষে যুক্তিগুলি পাস করার জন্য আর একটি ব্যাচের ফাইল না থাকলে আপনি ব্যবহার করতে পারেন FOR /F:

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

যেখানে iমধ্যে %%~fiপরিবর্তনশীল এ সংজ্ঞায়িত /F %%i। যেমন। আপনি যদি এটি পরিবর্তন করে থাকেন /F %%aতবে শেষ অংশটি হবে %%~fa

কমান্ড প্রম্পটে একই জিনিস অধিকার (এবং ব্যাচ ফাইল নেই) কাজের জন্য প্রতিস্থাপন %%সঙ্গে %...


ডিরেক্টরি পরিবর্তন না করা গুরুত্বপূর্ণ, কারণ cdকমান্ডটি প্রয়োজনীয়ভাবে %CD%পরিবেশের পরিবর্তনশীল পরিবর্তন করে না এমন রেসিপিটি শক্তিশালী করে তোলে (উদাহরণস্বরূপ আপনি যদি ড্রাইভে থাকেন D:এবং আপনার টার্গেটের পথটি চালু থাকে C:)
জেজ

@ জেজ তার জন্য আপনি ব্যবহার করতে পারেনcd /D D:\on.other.drive
সেবাস্তিয়ান

FOR /F %%i IN ("..\relativePath") DO echo absolute path: %%~fiযদি ..\relativePathস্পেস থাকে তবে ব্যর্থ হবে
সেবাস্তিয়ান

1
আমি / এফ পতাকা মুছে ফেলা এবং %% ~ dpfnI ব্যবহার করার সময় এটি কাজ করে। উল্লেখ করুন যে for /?প্রতিস্থাপক পরামিতিগুলির সাথে বিভ্রান্তি এড়াতে পরিবর্তনশীল নামের জন্য মূলধনপত্রগুলি ব্যবহার করার পরামর্শ দেয়
সেবাস্তিয়ান

1
@ সেবাস্তিয়ানগোলেটলেট অপসারণকারী /Fপাথগুলিতে কাজ করবে না এবং এটি ওয়াইল্ডকার্ড চরিত্রগুলি সমাধান করবে। আপনি যে চান তবে মহান, কিন্তু আপনি কার্যকারিতা চান /F, তাহলে আপনি ঠিক ব্যবহার করতে হবে tokensমূল শব্দ:FOR /F "tokens=*" %%I IN ("..\relative Path\*") DO echo absolute path: %%~fI
SvenS

15

এটি অ্যাড্রিয়েন প্লিসনের উত্তরের শূন্যস্থান পূরণ করতে সহায়তা করে (এটি সম্পাদনা করার সাথে সাথেই এটি উত্সাহিত করা উচিত ;-):

আপনি% ~ f1 ব্যবহার করে আপনার প্রথম যুক্তির পুরোপুরি যোগ্যতাসম্পন্ন পাথ পেতে পারেন তবে এটি বর্তমান পথ অনুসারে একটি পথ দেয় যা আপনি যা চান তা স্পষ্টতই নয়।

দুর্ভাগ্যক্রমে, আমি কীভাবে 2 টি একসাথে মিশতে জানি না ...

যে কেউ পরিচালনা করতে পারে %0এবং %1তেমনিভাবে:

  • %~dpnx0সম্পূর্ণ দক্ষ ড্রাইভের জন্য + পথ + নাম + ব্যাচফাইলে নিজেই প্রসারিত
    %~f0করাও যথেষ্ট;
  • %~dpnx1সম্পূর্ণরূপে যোগ্যতাসম্পন্ন ড্রাইভের জন্য + পথ + নাম + এর প্রথম যুক্তির প্রসার [যদি সে কোনও ফাইলের নামই হয় তবে]
    %~f1যথেষ্ট;

%~f1আপনি কীভাবে আপনার প্রথম যুক্তিটি নির্দিষ্ট করেছেন তার থেকে আলাদাভাবে কাজ করবে: আপেক্ষিক পাথের সাথে বা পরম পাথের সাথে (নামকরণের সময় আপনি যদি ফাইলের এক্সটেনশান নির্দিষ্ট না করেন তবে %1এটি যুক্ত করা হবে না, এমনকি আপনি ব্যবহার %~dpnx1করলেও -।

তবে পৃথিবীতে আপনি কীভাবে কোনও আলাদা ড্রাইভে কোনও ফাইলের নাম রাখবেন যদি আপনি প্রথম স্থানে কমান্ডলাইনে সেই পুরো পথের তথ্য না দেন?

যাইহোক, %~p0, %~n0, %~nx0এবং %~x0উপকারে এক্সটেনশন বা ফাইলের নাম একমাত্র এক্সটেনশন সঙ্গে আসা পারে, আপনি পথ (driveletter ছাড়া) আগ্রহী হওয়া উচিত, ফাইলের নাম (এক্সটেনশন ছাড়া), পূর্ণ ফাইলের নাম। কিন্তু নোট, যখন %~p1এবং %~n1পাথ অথবা প্রথম আর্গুমেন্ট নাম খুঁজে বের করতে কাজ করবেন %~nx1এবং %~x1যোগ + এক্সটেনশন দেন, যদি না আপনি ইতিমধ্যে কমান্ড তে এটি ব্যবহৃত হবে না।


সমস্যাটি %~dpnx1হ'ল এটি বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত আর্গুমেন্টের সম্পূর্ণরূপে যোগ্য পাথ প্রদান করে , যখন ওপিতে ব্যাচের ফাইলটি যে ডিরেক্টরিটিতে থাকে সেই ডিরেক্টরিটির সাথে সম্পর্কিত পথটি চায় ।
অ্যাড্রিয়েন প্লিসন

@ অ্যাড্রিয়েন প্লিসন: %~dpnx1প্রথম যুক্তির পুরোপুরি যোগ্যতাসম্পন্ন পথ সরবরাহ করে। মোটেও আপেক্ষিক নয় এবং বর্তমান দিরের সাথেও আপেক্ষিক নয়। dড্রাইভের জন্য হয়, pপথ হয়, nফাইলের নাম ব্যতিত প্রত্যয় জন্য, xপ্রত্যয় জন্য, 1প্রথম আর্গুমেন্ট জন্য। - এবং নাথনের প্রশ্ন ছিল: "ফাইলের নাম এবং / অথবা আপেক্ষিক পাথ সহ কোনও মান থেকে নিখুঁত পথ ফেরানোর কোনও উপায় আছে কি?"
কর্ট ফেফেল

উভয়ই, নিখুঁত এবং আপেক্ষিক পাথের ব্যবহার এবং উত্স সহ একটি বিবরণ । গুণগ্রাহী!
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

আমি এই সমস্যার অনেক সমাধান দেখিনি। কিছু সমাধান ডিরেক্টরি ব্যবহার করে ডিরেক্টরি ট্রভারসাল ব্যবহার করে এবং অন্যরা ব্যাচের ফাংশন ব্যবহার করে। আমার ব্যক্তিগত পছন্দটি ব্যাচ ফাংশন এবং বিশেষত ডসটিপস দ্বারা সরবরাহিত মেকএবসুলিউট ফাংশনটির জন্য।

ফাংশনটির কিছু আসল উপকারিতা রয়েছে, প্রাথমিকভাবে এটি আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করে না এবং দ্বিতীয়ত: মূল্যায়ন করা পাথগুলি এমনকি অস্তিত্বের প্রয়োজন নেই। কীভাবে এখানে ফাংশনটি ব্যবহার করবেন সে সম্পর্কে আপনি কিছু সহায়ক টিপস পেতে পারেন ।

এখানে একটি উদাহরণ স্ক্রিপ্ট এবং এর ফলাফলগুলি:

@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

আমি আশা করি এটি সাহায্য করে ... এটি অবশ্যই আমাকে সাহায্য করেছিল :) পিএস ডসটিপসকে আবার ধন্যবাদ! তুমি রক!


ধন্যবাদ @ জুলিদকো। আমি এর আগে সিমলিংকের বিরুদ্ধে চেষ্টা করি নি।
dayneo

2

আপনি কেবল তাদের সাথে সম্মতি জানাতে পারেন।

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

এটি আপনার পথের মাঝখানে \ .. with এর সাথে অদ্ভুত দেখাচ্ছে তবে এটি কাজ করে। পাগল কিছু করার দরকার নেই :)


এটি ঠিক কাজ করে। আরও সরল করা যেতে পারেecho %~dp0..\SomeFile.txt
কাপলিনেটর

1

আপনার উদাহরণে, বার \ পরীক্ষা.বাট থেকে, ডিআইআর / বি / এস .. \ somefile.txt পুরো পথে ফিরে আসবে।


এটি কোনও খারাপ ধারণা নয় ... আমি কি ডিআর-র ফলাফলের জন্য একটি ফর দিয়ে লুপ করব এবং কেবল প্রথম ফলাফলটি গ্রহণ করব?
নাথন টেলর

একাধিক ফাইল নিয়ে সমস্যাটি নিয়ে ভাবলাম। গুণগুলি কোনও সমস্যা ছিল কিনা তা আপনি নির্দিষ্ট করেননি, তাই আমি এটি নিয়ে গিয়েছিলাম। লুপের জন্য, লুপের জন্য "../" খাওয়ানোতে আমার সমস্যা হচ্ছে তবে ymmv। যদি আপনি এটি ডিআইআর কমান্ডটিতে না পেতে পারেন তবে আপনি কোনও ফাইলে আউটপুট পুনর্নির্দেশ করতে পারেন এবং এটির মাধ্যমে লুপ। আমি বলছি না যে পথটি আহরণের 'স্ট্যান্ডার্ড' উপায়টি খারাপ, এটি আমি কেবল ভেবেছিলাম আপনি যা বলেছিলেন তার থেকে আমার বেশি কাজ করেছে। উভয় সমাধানই 'কিছু' করে এবং তাদের উভয়েরই নিজস্ব ইস্যুগুলির সেট রয়েছে।
জর্জ সিসকো

ওহ..আর, যদি আপনি ডিআইআর সাফল্যের সাথে লুপ করেন তবে আপনি কোনও ফাইলে পুনর্নির্দেশ করতে পারেন এবং শেষ ফলাফল পেতে পারেন। আপনি যদি অর্ডারটিকে এমনভাবে উপস্থাপন করেন যা আপনার কাছে গ্রহণযোগ্য হয় তবে আপনি কেবল প্রথম ফলাফল পেতে পারেন। যদি আপনাকে ফাইলটির মধ্য দিয়ে লুপ করতে হয় তবে প্রথম ফলাফলটি অর্জনের ক্রমটি বিপরীত করা যা শেষ অবস্থানে থাকবে তাও সহায়তা করতে পারে। আমি যে কারণটির পরামর্শ দিচ্ছি তা হ'ল বাস্তবে সেগুলি মোকাবেলা করার পরিবর্তে প্রচুর জিনিস পাওয়া এবং ফেলে দেওয়া সহজ হতে পারে। আমার চিন্তার উপায়টি আপনার কাছে বোঝায় কিনা জানি না। একটি ধারণা হিসাবে এটি কেবল সেখানে রেখে দেওয়া।
জর্জ সিসকো

: আপনি একটি ফোল্ডারে একটি পাথ স্বাভাবিক করার প্রয়োজন হলে, আমি এই সমাধান সুপারিশ stackoverflow.com/questions/48764076/...
uceumern

0

পাওয়ারশেল এই দিনগুলিতে খুব সাধারণ তাই আমি এটি প্রায়শই সি # র জন্য দ্রুত উপায় হিসাবে ব্যবহার করি কারণ এতে বেশ কিছু কিছুর কার্যকারিতা রয়েছে:

@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.