我的路径指向一个云文件夹(位于我各个设备的各个位置),其中我存储了一个批处理文件,该文件应该位于机器上,然后将该目录设为该会话的新工作目录。
查找文件
@echo off
没有杂乱
cls
重新开始
Echo Searching
因为有时需要一段时间
dir /b /s myScripts.bat
这将输出完整目录,包括文件名。
所以我的第一个问题是删除文件名。这是我尝试过的:
set stringOne=dir /b /s myScripts.bat
%stringOne:~0, 60%
我找到了一个用于计算字符串长度的脚本,如果事实证明我确实需要这些值,我将稍后使用它来自动推断这些值。
问题是我发现如果我将该数字降低到 10,则 dir 命令会缩短如下:
dir c:\users\myUsername\cloudDrive\scripts
,或者无论哪种情况,cmd 都会输入dir c:\users\m
并递归搜索所有这些。
再次强调,我希望它向我显示它所搜索目录的修改版本,而不是修改目录搜索命令。稍后我将使用生成的最终字符串来设置我的工作目录,但我尝试一步一步地进行,以便了解正在发生的事情。
编辑:脚本的最终目标与我编写它的目的不同。当一切都说完了,我应该能够在任何计算机上将 myScripts.bat 输入 cmd,并将我的云文件夹附加到它的 PATH 中,它将通过 dir 命令获取该云文件夹的目录,然后将其工作目录更改为批处理文件的目录。
答案1
回答这部分:
这会输出完整目录,包括文件名。所以我的第一个问题是删除文件名。
在批处理文件中你可以执行
@echo off
:: locate 'myScripts.bat' and save its directory to 'myDir'
:: in case of multiple matches 'myDir' will be set to the last one
set "myDir="
for /f "delims=" %%x in ('dir /b /s myScripts.bat') do set "myDir=%%~dpx"
if not defined myDir echo not found ?? & exit /b 1
:: ready to use
echo myDir = "%myDir%"
为了更好地掌握批处理文件,我建议您阅读内置帮助,从set /?
、if /?
、for /?
、开始call /?
。
[编辑] 添加"delims="
以正确处理带有空格的路径。
答案2
假设您创建一个名为 test.cmd 的批处理文件,并在其中放置以下文本,则输出将如下所示:
@echo off
echo %0
echo %cd%
set currentpath=%0
::remove any " if present
set currentpath=%currentpath:"=%
:: remove last 9 characters
set currentpath=%currentpath:~0,-9%
:: add quotes back
set currentpath="%currentpath%"
echo %currentpath%
pause
输出结果如下:
C:\Windows\System32>%appdata%\..\..\desktop\test.cmd
%0: C:\Users\LPChip\AppData\Roaming\..\..\desktop\test.cmd
%cd%: C:\Windows\System32
%currentpath%: "C:\Users\LPChip\AppData\Roaming\..\..\desktop"
Press any key to continue . . .
第一个命令使用替换函数。~ 运算符表示子字符串替换,通过添加 0,新字符串从位置 0 开始,-9 表示从右边开始 9 个位置。
当然,最快捷、最简单的方法仍然是使用 %cd% 来获取当前目录,但是当您想找到批处理文件本身所在的当前路径时,另一种方法就可以做到这一点。
这个网站是学习有关字符串操作的更多信息的绝佳资源:dostips.com