Windows批处理:获取没有缩短的路径

时间:2014-07-23 16:12:18

标签: windows batch-file

我现在搜索了几个小时,并没有为我找到任何合适的解决方案。

当我尝试获取批处理文件的当前路径时,我使用normaly%~dp0。 这将导致路径如:D:\ VM \ TUTORI~2 \ STARTS~1.BAT

然而,如果只进行文件管理,这不是问题,但我想使用脚本来调用Vagrant命令。 碰巧流浪者系统不喜欢这种缩短的路径。 一旦路径足够短或我直接从CMD调用它,它就可以正常工作。

我现在正在寻找一种方法来获取任何未经训练的路径到我的工作目录。 但到目前为止我所尝试的任何东西都没有用,谷歌只向我提供了人们如何缩短他们的路径。 这个问题是否有实用的解决方案?

我想在我的脚本中设置一个如下所示的变量: d:\ VM \ tutorialtest

修改

根据接受的答案,我的工作片段是2. For循环中没有“-2”的片段。无论文件夹在哪里,这都会给我路径。

setlocal EnableDelayedExpansion
set myPath=%~DP0
set myPath=%myPath:*\=%
set fullPath=
pushd \
for %%a in ("%myPath:\=" "%") do (
   set thisDir=%%~a
   for /D %%d in ("!thisDir:~0!*") do (
      set fullPath=!fullPath!\%%d
      cd %%d
   )
)
popd
echo Full path: %~D0%fullPath%

结果:

D:\VM\tutorialtest

4 个答案:

答案 0 :(得分:1)

试试这个:

@echo off
setlocal EnableDelayedExpansion

set "myPath=%~DP0"
set "myPath=%myPath:*\=%"
set "fullPath="
pushd \
for %%a in ("%myPath:\=" "%") do (
   set "thisDir=%%~a"
   for /D %%d in ("!thisDir:~0,-2!*") do (
      set "fullPath=!fullPath!\%%d"
      cd "%%d"
   )
)
popd
echo Full path: %~D0%fullPath%

请发布结果。

编辑错误修复

问题是切割少于2个字符的名称! (我的错误)。

我做了一些测试,似乎for /D %%d in ("TUTORI~2*") ...也返回文件夹的全名,因此不需要thisDir变量。您可以通过这种方式修改for %%a循环并获得相同的结果:

for %%a in ("%myPath:\=" "%") do (
   for /D %%d in ("%%~a*") do (
      set fullPath=!fullPath!\%%d
      cd %%d
   )
)

答案 1 :(得分:1)

编辑 - 更正了可以使用带或不带空格的路径的代码。

for /f "delims=" %i in ('dir ^| findstr /i /c:"Directory of"') do set mypath=%i
set mypath=%mypath: Directory of =%

如果您在命令控制台中直接输入以上代码,如果您想在批处理文件中使用它,请按以下方式使用它。

for /f "delims=" %%i in ('dir ^| findstr /i /c:"Directory of"') do set mypath=%%i
set mypath=%mypath: Directory of =%

我相信你需要获取当前的工作目录(类似于Unix中的pwd)。 'dir'命令通常返回当前路径详细信息以及variuos其他详细信息。我们只选择带有目录名称的行(标记为“Directory of”的行),然后在第二行中删除标记“Directory of”(将其替换为none)。

请参阅以下链接,了解更多字符串操作技巧。

http://www.dostips.com/DtTipsStringManipulation.php

示例输出 - 在命令控制台上输入

C:\test\new folder>for /f "delims=" %i in ('dir ^| findstr /i /c:"Directory of"') do set mypath=%i

C:\test\new folder>set mypath= Directory of C:\test\new folder

C:\test\new folder>set mypath=%mypath: Directory of =%

C:\test\new folder>echo.%mypath%

答案 2 :(得分:0)

你有没有尝试过:

set $path=%cd%
echo %$path%

答案 3 :(得分:0)

如果在打开cmd窗口时出现这种情况,请在cmd提示符下键入echo %comspec%并查看它返回的内容:如果它有command.com作为其一部分,那么它已被更改。< / p>

另一种可能性是,用于打开cmd window的快捷方式在属性中有command.com来启动它。

如果 使用快捷方式,请尝试从Win + R热键中打开cmd提示符,然后键入cmd并输入。看看这种行为是否已经改变,但也要再次检查上面的第一点。