2010-03-06 88 views
4

我遇到問題了。我有一個模仿UNIX的cd命令的批處理文件。它需要一個由用戶輸入的UNIX風格路徑,將其保存爲一個名爲upath2的變量,將其轉換爲Windows風格的路徑,然後將cd保存到該目錄(例如「/ program files/7-zip」將變爲「C: \ Program Files \ 7-Zip「)。類Windows的輸出將被保存爲名爲upath2的變量,並且cmdcd命令將執行並更改爲該目錄。批處理腳本問題 - 搜索並替換變量中的變量?

除了這個「UNIX」cd命令,我還創建了一個名爲「bashemu.bat」的批處理文件,它給了我一個類似bash的提示。所有這些命令都是doskey條目,它們鏈接到我創建的bin和usr \ bin文件夾,這些文件夾包含所有的.bat命令。然後它會在最後執行「cmd/v/k」,這樣我就可以輸入doskey別名並啓動我所有的UNIX風格的命令。

現在,這裏是我的問題:當我的CD-ING我的C的子目錄:\用戶\ xplinux557文件夾 (存儲在一個名爲「unixhome」環境變量),從bashemu變化提示:

[email protected]:~$ 

,例如:

[email protected]:/Users/xplinux557/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$ 

路徑這樣的太長要在命令提示符bashemu內舒適地使用,所以我試圖讓cd命令閱讀完整upath2變量,檢查它是否包含主路徑(如de被unixhome罰款),並簡單地用〜代替。這應該關閉這個:

[email protected]:/Users/xplinux557/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$ 

到這一點:

[email protected]:~/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$ 

AAAAH,好多了!我的第一種方法是將upath的UNIX樣式路徑轉換爲Windows樣式路徑並命名爲新的var upath2,並將文本%unixhome%替換爲「〜」。這是代碼如何看起來像:

:: set the batch file to retrieve all text from its parameters and replace all 
:: unix-style slashes the user put in and replace those with a windows-style backslash 
@echo off 
set upath=%* 
set upath=%upath:/=\% 

:: cd to the directory that the user typed in, windows-style 
cd "%upath%" 

:: Set the upath2 var to the current directory and replace whatever unixhome was 
:: a "~" 
set upath2=%cd:%unixhome%="~"% 

:: Remove the "C:" or "D:" from the quote 
set upath2=%upath2:~2% 

:: then, set the prompt to read: 
:: "[email protected]:~/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$" 
prompt=%USERNAME%@%USERDOMAIN%:%upath2% $$ 

::EOF 

一切工作完全正常,除了讀取行:

set upath2=%cd:%unixhome%="~"% 

我意識到它弄亂了,並承認%CD:%和%=」 〜「%作爲變量,並給我一個錯誤消息。我真的很抱歉漫不經心,就像這樣:)但長話短說,有沒有辦法取得變量A的文本,並且如果在變量B中找到該文本,則取代該文本?

謝謝大家提前!

+0

我必須問...你知道你可以簡單地在Windows上運行Bash嗎? http://www.mingw.org/wiki/MSYS – 2010-03-06 21:50:23

+0

哇,這只是爲了得到一個非常怪異的環境而付出的很多努力。實際上,這看起來比DOS,cmd或bash都要痛苦多了...... – Joey 2010-03-06 21:57:07

+0

哦,我在業餘時間只是把它當做業餘愛好而已。 :)我只是想看看bash可能會有多相似。我的計算機上安裝了MinGW,但無論如何,我只是想創建一個可用於擁有類似UNIX的環境的文件庫,完全由DOS批處理腳本編寫。 – 2010-03-06 22:05:58

回答

0

打開延遲擴展與

​​

,並使用

set upath2=!cd:%userprofile%=~! 

注意setlocal將開始一個新的變量範圍,該範圍不會以外堅持內部完成環境變量的任何變化它。

你可以,但是,做一個一次性使用以下命令:

setlocal enabledelayedexpansion 
set upath2=!cd:%userprofile%=~! 
endlocal&set upath2=%upath2% 
+0

謝謝,但它沒有奏效。它cd到正確的目錄,但提示保持「xplinux557 @ bash-pc:〜$」。它根本沒有改變。 (雖然我得給你道具,以阻止它讓我煩人的錯誤信息:) – 2010-03-06 22:16:13

+0

是的!有效!但是,除了一個小問題外,當我在用戶目錄之外進行光盤刻錄時,路徑不再是UNIX格式;它顯示爲: 「xplinux557 @ bash-pc:C:\ Program Files \ NetBeans $」 – 2010-03-06 22:26:04

+0

我看到這是公認的答案。在我看來,使用CALL SET(請參閱http://stackoverflow.com/questions/2394208/batch-scripting-question-search-and-replace-a-variable-in-a-variable/2394291#2394291)更簡單,比使用setlocal/endlocal對更清晰。它是一行代替3. Setlocal/endlocal有它的位置,但它通常不包含一行代碼。 – Cheeso 2010-03-07 01:28:12

1

你可以做一個 「EVAL」 使用CALL SET

:: This does not work: set upath2=%cd:%unixhome%=~% 

:: This works: 
:::: uhome is the homepath, with unix-style (forward) slashes 
set uhome=%HOMEPATH:\=/% 
:::: ucwd is the current working directory, with unix-style (forward) slashes 
set ucwd=%cd:\=/% 

:: replace any occurence of uhome in ucwd with ~ 
CALL SET ucwd=%%ucwd:%uhome%=~%% 

:: strip drive letter and colon 
set ucwd=%ucwd:~2% 

:: set prompt 
prompt=%USERNAME%@%USERDOMAIN%:%ucwd% $$ 

當我把這個我得到[email protected]:~/Documents/dev/batch

ps:我想你有一個bug。你不想要%cd:...。你需要一個帶有正斜槓的變量。

另外:這不會是堅如磐石的可靠。考慮一下你有這樣的目錄結構的情況:

c:\Users\John\Other 
    c:\Users\John\Other\Users 
    c:\Users\John\Other\Users\John 
    c:\Users\John\Other\Users\John\data 

......在這種情況下,你會得到2 twiddles。

+0

:熱切地編碼爲我輸入: 實際上,我確實需要cd,因爲腳本調用將目錄更改爲upath(用戶鍵入的內容),然後獲取cd所在的完整,完整的Windows樣式路徑,並替換帶「〜」的主文件夾。 無論如何,我會回覆並讓你知道它是如何發生的。 – 2010-03-06 22:20:52

+0

您不需要%CD%,因爲斜線正面臨錯誤的方向。我假設%unixhome%擁有/ users/Fred(fwd斜線)。在這種情況下,替代將永遠不會發生。所以我想你想%cd:\ = /%。我的理解可能與您的情況不同,因爲相對與完整的路徑。 – Cheeso 2010-03-06 22:25:47

+0

謝謝,但不幸的是,當我嘗試你的代碼時,發生了同樣的事情,當我約翰內斯Rössel的代碼(向下滾動查看我的評論)。 PS:「unixhome」可能是這個var的一個非常糟糕的名字:P它包含主目錄,Windows風格,upath4包含Unix風格。我應該可能會轉換那兩個。對不起,不清楚 – 2010-03-06 22:29:20