在Windows bash上自动创建符号链接
在Windows bash上自动创建符号链接
我正在尝试制作一个脚本来进行一些目录管理。最终脚本将在Windows上运行,并且最好用Python编写。在脚本的某个地方,我需要自动创建多个文件夹之间的符号链接。脚本本身在一个bash终端(Git Bash)中以非管理员权限运行。Windows没有处于开发者模式。\n最完美的解决方案是拥有一个元组列表(链接,源),并一次性创建相应的符号链接,只需按一次“是”获取管理员权限。\n我已经做了一些研究:\n
- \n
- 如何在提升的cmd中创建目录之间的符号链接:Git Bash shell fails to create symbolic links\n
mklink /D 链接 源目录
\n - 如何在bash内部以管理员身份运行cmd命令:Launch Elevated CMD.exe from Powershell\n
powershell \'start cmd -v runAs -Args /k, [逗号分隔的参数]\'
\n - 如何在以管理员身份启动的powershell命令中设置工作目录(否则将在C:\\Windows\\System32\\内部启动终端):PowerShell: Run command from script\'s directory\n
powershell \'start cmd -v runAs -Args /k, cd, $pwd, \"&\", [逗号分隔的参数]\'
\n
\n
\n
\n
\n假设我想在当前工作目录中创建到相对目录的符号链接。我尝试了2种方法:\n
- \n
- 当我将上述所有点结合起来,并从Git Bash终端执行以下命令时:\n
powershell \'start cmd -v runAs -Args /k, cd, $pwd, \"&\", mklink, /D, \\\"link_to_utils\\\", \\\"common\\utils\\\"\'
\n一个新的终端打开了(在同意管理员权限后)。但它导致在C:\\的根目录下创建了一个新的符号链接。\n - 当我执行这个命令:\n
powershell \'start cmd -v runAs -Args /k, cd, $pwd
\n一个新的终端打开了(在同意管理员权限后)。现在我可以运行这个命令:\nmklink /D \"link_to_utils\" \"common\\utils\"
\n链接被创建在我想要的当前工作目录中。\n
\n
\n
\n所以我的问题是:\na)如何使选项1在bash中工作?\nb)为什么它实际上在C:\\中创建了符号链接?\nc)有没有办法将命令传递到已打开的提升的cmd终端(使选项2工作)?\n注意:我一直在尝试使用Python和win32api(pywin32)找到解决方案。但这导致了每个需要创建的符号链接都会打开一堆命令提示符。而且关于pywin32几乎没有任何文档资料。
在Windows bash上自动创建符号链接的问题是由于缺乏自动化方法导致的。可以使用PowerShell的New-Item
命令以提升的权限来创建符号链接。下面是使用PowerShell创建符号链接的示例:
$link = New-Item -ItemType SymbolicLink -Path .\link -Target .\Notice.txt $link | Select-Object LinkType, Target LinkType Target -------- ------ SymbolicLink {.\Notice.txt}
以上代码使用New-Item
命令创建了一个名为"link"的符号链接,目标文件为"Notice.txt"。通过选择对象的方式,我们可以看到该符号链接的类型为SymbolicLink,目标为".\Notice.txt"。
通过以上方法,可以在Windows bash上自动创建符号链接。
在Windows的bash环境中,自动创建符号链接的问题出现的原因是由于PowerShell解释传递的命令行的内容时,需要遵循其语法规则。这意味着需要使用双引号"..."
来扩展(字符串插值)自动的$PWD
变量,并且在该字符串内部的嵌入的"
字符必须使用`"
进行转义(也可以使用""
进行转义)。
解决这个问题的方法是使用以下命令行:
powershell 'Start-Process -Verb RunAs cmd /k, " cd `"$PWD`" & mklink /D `"link_to_utils`" `"common\utils`" "'
这个命令行通过一个字符串参数传递给cmd.exe
,以便在概念上更加清晰。