有没有办法无需使用完整路径即可导航到位于父目录的不同文件夹中的程序?
atm 我这里有一批:
FOLDER 1\BATCHES\batch1.bat
它使用位于以下位置的程序:
FOLDER 1\PROGRAMS\pro.exe
我的批次如下所示:
"%SYSTEMDRIVE%\Temp\FOLDER 1\PROGRAMS\pro.exe" --input "%SYSTEMDRIVE%\Temp\FOLDER 1\SCRIPT\script.srpt" --output "%SYSTEMDRIVE%\Temp\FOLDER 1\FILES\myfile.x"
正如您所看到的,它被锁定在一个地方,%SYSTEMDRIVE%\Temp\
为了使我的脚本“可移植”,有什么我可以替换它%SYSTEMDRIVE%\Temp\
吗?
或者换句话说:我想%SYSTEMDRIVE%\Temp\
从我的批次中删除所有出现的,并用某种方式替换它,如果我移动我的文件夹 1在我的电脑上的任何位置,它都可以运行
答案1
%~dp0
可以使用(带尾部反斜杠)获取批次所在的文件夹- 文件系统负责处理具有
..
上一级含义的相对文件夹。
就像tree A: /F
这样:
A:.
└───Folder 1
├───BATCHES
│ batch1.bat
│
├───FILES
│ myfile.x
│
├───PROGRAMS
│ pro.exe
│
└───SCRIPT
script.srpt
本批次:
:: A:\FOLDER 1\BATCHES\batch1.bat
@Echo off
Echo batch1 folder is: %~dp0
Echo ======================
for %%A in ("%~dp0..\PROGRAMS\pro.exe") Do set "_Prg=%%~fA"
for %%A in ("%~dp0..\SCRIPT\script.srpt") Do set "_Inp=%%~fA"
for %%A in ("%~dp0..\FILES\myfile.x") Do set "_Out=%%~fA"
Set _
Echo "%_Prg%" --input "%_Inp%" --output "%_Out%"
将有这样的输出:
A:\> "Folder 1\BATCHES\batch1.bat"
batch1 folder is: A:\Folder 1\BATCHES\
======================
_Inp=A:\Folder 1\SCRIPT\script.srpt
_Out=A:\Folder 1\FILES\myfile.x
_Prg=A:\Folder 1\PROGRAMS\pro.exe
"A:\Folder 1\PROGRAMS\pro.exe" --input "A:\Folder 1\SCRIPT\script.srpt" --output "A:\Folder 1\FILES\myfile.x"
答案2
让我们考虑以下场景:
d:\bat> tree /F "d:\temp\FOLDER 1"
Folder PATH listing for volume VolName
Volume serial number is ABCD-EFGH
D:\TEMP\FOLDER 1
├───BATCHES
│ batch1.bat
│
└───PROGRAMS
pro.exe
然后,使用%~dp0
相对于批处理脚本的链接和..
父目录的相对路径就像下面的脚本一样:
@echo OFF
SETLOCAL EnableExtensions
echo(
echo listing "%~dp0"
dir /B /S "%~dp0"
echo listing "%~dp0..\programs"
dir /B /S "%~dp0..\programs"
输出:
d:\bat> "d:\temp\FOLDER 1\BATCHES\batch1.bat"
listing "d:\temp\FOLDER 1\BATCHES\"
d:\temp\FOLDER 1\BATCHES\batch1.bat
listing "d:\temp\FOLDER 1\BATCHES\..\programs"
d:\temp\FOLDER 1\programs\pro.exe
d:\bat>
笔记那%~dp0..\PROGRAMS
不同通常来说..\PROGRAMS
:
%~dp0..\PROGRAMS
是相对于批次所在目录的路径- (
d:\temp\FOLDER 1\BATCHES\
如上例所示)
- (
..\PROGRAMS
是相对于批处理启动的当前目录的路径- (
d:\bat\
如上例所示)
- (