将Windows路径转换为Unix友好型

3

早上好,

我需要将.bat文件中的windows路径转换为Linux友好型,例如从C:\Users\Luga/c/Users/Luga

到目前为止,我找到的唯一方法是:

set profile_new=%UserProfile:\=/%
set profile_new=%profile_new::=%
set profile_new=/%profile_new%

这里有一种方法可以实现,但是我不知道如何将大写驱动器号更改为小写,而这很重要(我需要能够对所有可能的字母进行更改)。

感谢您的任何建议。

编辑:我需要它来使docker卷工作-在仅具有docker工具箱的计算机上运行.bat脚本。

使用aaaaaa123456789评论中的解决方案。


3
只有26个字母;你可以手动为每个字母进行替换吗?用/a代替A:,用/b代替B:,以此类推。 - aaaaaa123456789
1
我想我可以这样做,但这不是一个好的解决方案,如果有更好的方法,我想知道。 - Luga
1
这个网站并不能真正回答什么对你来说是更好的,而且询问基于个人意见的答案的问题不适合在这里讨论。如果某个东西能够完成工作,那就可以了,如果您希望将其缩短、提高效率或使其看起来更聪明一些,那么也许一旦您有了一个可行的脚本,您可以将其发布在代码审查(Code Review)上获得这种建议。 - Compo
你可以这样做,尽管你仍然需要列出所有的字母:for %%L in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do call set "profile_new=%%profile_new:%%L:=%%L%%"(这不处理\替换,也不在前面加上/)。通过它们的ASCII循环遍历字母,在批处理脚本中并不容易,而且肯定比这种方法慢得多... - aschipfl
这个问题似乎被忽略了一个关键点。CYGWIN所做的事情与MINGW64所做的事情以及WSL所做的事情是不同的。在Windows和Unix路径之间没有映射,这取决于系统。它取决于Windows文件系统如何以及在哪里被挂载。例如:WSL=/mnt/c/Users,MINGW64=/c/Users等等。我假设你正在使用CYGWIN或MINGW64。 - Señor CMasMas
@Luga,所以你认为有一个更好的解决方案,但你选择硬编码了26个设置语句?我和aschipfl都给了你一个更好的解决方案。 - Squashman
3个回答

3
我可能会利用批处理文件中的 来完成这个任务:
For /F "Delims=" %%A In ('
    PowerShell -NoP "$Env:UserProfile.Replace('\','/').Replace(':','').ToLower()"Replace(':','')).ToLower()"
')Do Set "$UserProfile=/%%A"

显然,在这种情况下,变量%$UserProfile%将保存所需的值。

或者,一种基于的想法:

For /F "Tokens=1*Delims=:" %%A In ('WMIC FSDir Where^
 "Name='%UserProfile:\=\\%'" Get Name /Value 2^>Nul')Do Set "$%%A%%B" 2>Nul
Set "$Name=/%$Name:\=/%"

在这种情况下,变量%$Name%将保存您需要的值。

For /F "Delims=" %%A In (' PowerShell -NoP "$Env:REPLACE_ME.Replace('','/').Replace(':','').ToLower().Replace(':','').ToLower()" ') Do Set "REPLACE_ME=/%%A" - Sanctus

1

在大多数*nix和Windows环境中,确实有很好的工具可以使用。手动操作最好不要这样做,因为有更好的方法来解决问题。

如果您使用CYGWIN或MINGW,请使用cygpath实用程序。

如果您使用WSL,请使用wslpath。

如果您使用其他任何东西,则挂载路径将不同,使得此对话无意义。我相信如果您挂载Samba共享,它不会在/c/中。

如果您需要帮助使用它们,请参考Squashman在下面的评论中关于Tour和How-to的说明。

祝你好运。


0

大小写问题在StackOverflow上已经讨论过多次。简单的搜索就会给你带来很多选择。

这里是一个可能适合你的解决方案。

@echo off
FOR /F "TOKENS=1,2 DELIMS=:" %%G IN ("%UserProfile:\=/%") DO (
    set "drive=%%G"
    set "upath=%%H"
)
CALL :toLower drive
set profile_new=/%drive%%upath%
echo %profile_new%
pause
GOTO :EOF

:toLower str -- converts uppercase character to lowercase
::           -- str [in,out] - valref of string variable to be converted
:$created 20060101 :$changed 20080219 :$categories StringManipulation
:$source https://www.dostips.com
if not defined %~1 EXIT /b
for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i"
            "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r"
            "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" "Ä=ä"
            "Ö=ö" "Ü=ü") do (
    call set %~1=%%%~1:%%~a%%
)
EXIT /b

1
带有变音符号的字母可以作为驱动器字母吗? - Klitos Kyriacou
谢谢-我确实找到了一些大小写解决方案,但由于我不太擅长编写批处理文件,所以无法成功将它们应用于我的脚本。 - Luga
@Luga,如果这些信息与您的问题有关,请将它们包含在您的问题中。请参阅Tour。请阅读如何提出好问题?。同时请阅读如何创建最小、完整和可验证的示例 - Squashman
抱歉,下次会做得更好。 - Luga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接