5

我有个问题。我有一个模仿 UNIX cd 命令的批处理文件。它采用用户输入的 UNIX 样式路径,将其保存为名为 upath2 的 var,将其转换为 Windows 样式路径,然后 cd 到该目录(例如,“/program files/7-zip”将变为“C: \Program Files\7-Zip")。类似 Windows 的输出将保存为名为 upath2 的 var,并且cmd' 的cd命令将执行并切换到该目录。

除了这个“UNIX”cd 命令,我还创建了一个名为“bashemu.bat”的批处理文件,它给了我一个类似 bash 的提示。所有命令都是 doskey 条目,它们链接到我创建的 bin 和 usr\bin 文件夹,其中包含所有 .bat 命令。然后它在最后执行“cmd /v /k”,这样我就可以输入 doskey 别名并启动我所有的 UNIX 样式命令。

现在,这是我的问题:当我 cd-ing 到我的 C:\Users\xplinux557 文件夹的子目录(存储在一个名为“unixhome”的环境变量中)时,bashemu 的提示从:

xplinux557@bash-pc:~$

例如:

xplinux557@bash-pc:/Users/xplinux557/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$

像这样的路径太长了,无法在命令提示符中的 bashemu 中舒适地使用,所以我试图让 cd 命令读取完整的 upath2 变量并检查它是否包含主路径(由 unixhome 定义)并且简单地用〜替换它。这应该变成这样:

xplinux557@bash-pc:/Users/xplinux557/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$

进入这个:

xplinux557@bash-pc:~/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$

啊啊,好多了!我的第一种方法是将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:
:: "xplinux557@bash-pc:~/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$"
prompt=%USERNAME%@%USERDOMAIN%:%upath2% $$ 

::EOF

一切都很好,除了以下行:

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

我意识到它搞砸了并将 %cd:% 和 %="~"% 识别为变量并给我一条错误消息。我真的很抱歉像这样胡说八道:),但长话短说,有没有办法获取变量A的文本,如果在变量B中找到该文本,则替换该文本?

谢谢大家!

4

2 回答 2

1

您可以使用以下方法进行“评估” 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% $$

当我打电话给这个时,我得到 User@Machine:~/Documents/dev/batch

ps:我认为你有一个错误。你不想%cd:...。你想要一个带有正斜杠的变量。

另外:这不会是坚如磐石的可靠。考虑一下你有这样一个 dir 结构的情况:

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

...在这种情况下,您将获得 2 个 twiddles。

于 2010-03-06T22:15:08.940 回答
0

打开延迟扩展

setlocal enabledelayedexpansion

并使用

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

请注意,这setlocal将启动一个新的变量范围,并且在该范围内对环境变量所做的任何更改都不会在该范围之外持续存在。

但是,您可以为一次性使用执行以下操作:

setlocal enabledelayedexpansion
set upath2=!cd:%userprofile%=~!
endlocal&set upath2=%upath2%
于 2010-03-06T21:58:37.067 回答