gpt4 book ai didi

batch-file - 批处理脚本问题 - 在变量中搜索和替换变量?

转载 作者:行者123 更新时间:2023-12-03 17:21:01 26 4
gpt4 key购买 nike

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

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

现在,这是我的问题:当我 cd 到我的 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 中找到该文本,则替换该文本?

谢谢大家!

最佳答案

您可以使用 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:... .你想要一个带正斜杠的变量。

另外:这不会是坚如磐石的可靠。考虑一下你有一个这样的目录结构的情况:
  c:\Users\John\Other
c:\Users\John\Other\Users
c:\Users\John\Other\Users\John
c:\Users\John\Other\Users\John\data

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

关于batch-file - 批处理脚本问题 - 在变量中搜索和替换变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com