如何让 Windows 命令提示符从命令输出中返回子字符串

如何让 Windows 命令提示符从命令输出中返回子字符串

我的路径指向一个云文件夹(位于我各个设备的各个位置),其中我存储了一个批处理文件,该文件应该位于机器上,然后将该目录设为该会话的新工作目录。

查找文件

@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

相关内容