2014-07-23 34 views
0

我現在搜索了幾個小時,並沒有找到任何適合我的解決方案。Windows批處理:獲取路徑而不縮短

當我嘗試獲取批處理文件的當前路徑時,我正常使用%〜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 

回答

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 
    ) 
) 
+0

我已經編輯了一小段剪輯並添加了一些迴響以查看發生了什麼。可悲的是,這並沒有完全起作用,但它看起來像在那裏只是一些邏輯錯誤。這裏是代碼: – Panade

+0

'SETLOCAL EnableDelayedExpansion 組mypath中=%〜DP0 組mypath中=%mypath中:* \ =% 組FULLPATH = PUSHD \ 用於%%一個在( 「%mypath中:\ =」「% 「)do( set thisDir = %%〜a echo A:%% a for/D %% d in(」!thisDir:〜0,-2!*「)do( echo D:%% d 組FULLPATH = FULLPATH \ %% d CD %% d ) ) POPD 回波全路徑:!%〜D0%FULLPATH%' – Panade

+0

,輸出爲(縮短一個位): '一個:「 VM「 D:adobePreview D:DirectX Das System kann den angegebenen Pfad nicht finden。 D:驅動程序 Das System kann den angegebenen Pfad nicht finden。 D:日食 D:VM Das System kann den angegebenen Pfad nicht finden。 D:workspace Das System kann den angegebenen Pfad nicht finden。 A:「TUTORI〜2」 A:「」 完整路徑:D:\ DirectX \ Drivers \ eclipse \ VM \ workspace' – Panade

0

你嘗試:

set $path=%cd% 
echo %$path% 
+0

嘗試在我的腳本現在,但沒有幫助。 所有這些都是使用%cd%變量,但該變量也會縮短。 我認爲一種方法來恢復這種縮短應該存在於任何地方。 – Panade

+0

您是否使用'command.com',因爲'cmd.exe'默認不使用短名稱? – foxidrive

+0

它的正常窗口cmd.exe 但是我已經閱讀過某些地方Windows 7默認它的路徑縮短。但是,該腳本應該設計爲無需進一步系統配置即可工作。 – Panade

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的其他詳細信息。我們只是選擇目錄名稱(帶有「目錄」標籤的行),然後在第二行中刪除標籤「目錄」(將其替換爲無)。

請參考下面的鏈接獲取更多的字符串操作技巧。

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% 
+0

即使在路徑中有空格:'for/f「tokens = 2 *」%i in('dir^| findstr/i/c:「''的目錄)do set mypath = %j' – Aacini

+0

太好了。我不太瞭解在令牌中使用*。你能幫我理解嗎? – gbabu

+0

我不太明白,如果我不得不在這裏編輯一些東西。代碼片段現在在這裏,不在我的批處理腳本中工作。 另外對發生的事情的簡短描述會很棒。 – Panade

0

上鍵入如果出現這種情況,當你打開一個cmd窗口,然後在命令提示符輸入echo %comspec%,看看它返回:如果有command.com作爲它的一部分,然後它被改變了。

另一種可能性是,用於打開cmd window的快捷方式在屬性中有command.com以啓動它。

如果你使用快捷方式,然後嘗試從Win + R熱鍵打開cmd提示符並鍵入cmd並進入。看看這種行爲是否發生了變化,但是還要再次檢查上面的第一點。