如何使用命令行别名在Cmder中创建带有空格路径的联接

3

我在Windows 10上使用Cmder(ConEmu 161206 [64]稳定版)。我想要创建一个名为cloud的别名,用于创建联接。这是我在Cmder中输入的内容:

alias cloud=mklink /J "C:\Users\chjensen\OneDrive - chjensen\$1" "$2"

假设我想创建一个名为Sublime的链接文件夹,目标是我的Sublime软件包,位于C:\Program Files\Sublime Text 3\Data\Packages。我尝试了以下代码:

cloud sublime C:\Program Files\Sublime Text 3\Data\Packages

但是该命令的输出结果如下:
Junction created for C:\Users\chjensen\OneDrive - chjensen\sublime <<===>> C:\Program
第一个路径是正确的,但第二个路径C:\Program被截断了。当我试图访问链接目录时,显然无法访问,因为它试图链接到不存在的C:\Program。
如果我手动编写整个命令,则可以正常工作:
mklink /J "C:\Users\chjensen\OneDrive - chjensen\sublime" "C:\Program Files\Sublime Text 3\Data\Packages"

针对C:\Users\chjensen\OneDrive - chjensen\sublime创建连接 <<===>> C:\Program Files\Sublime Text 3\Data\Packages

我还尝试在实际命令中使用引号:

alias cloud=mklink /J "C:\Users\chjensen\OneDrive - chjensen\$1" $2
cloud sublime "C:\Program Files\Sublime Text 3\Data\Packages"

但我却得到了相同的结果。
我做错了什么?
1个回答

1
为了解决这个问题,您可以使用以下代码(这不是非常优雅的解决方案,但它会相当好地工作)。请注意,我正在使用 c:\temp 进行测试,而不是您的主目录,但其概念是相同的。
alias cloud=mklink /J "C:\temp\OneDrive - chjensen\$1" $2 $3 $4 $5 $6 $7 $8 $9

这是MS cmd命令:
cloud sublime "C:\Program Files\Sublime Text 3\Data\Packages"

这是调试别名的简单方法,使用 echo 命令将其输出到终端:
alias cloudp=echo mklink /J "C:\temp\OneDrive - chjensen\$1" $2 $3 $4 $5 $6 $7 $8 $9

正如你所提到的,你遇到的问题是$2被翻译成了"C:\Program$3=Files\Sublime等。通过这种不太优雅的解决方案,它将把它们全部重新组合在一起,包括空格和最后一个双引号后面可能存在的一些尾随空格,我们并不关心。
你可以尝试使用脱字符号来转义每个空格,例如C:\Program^ Files\Sublime^ Text^ 3\Data\Packages,但我认为它不会起作用,而且你也不想每次都记得加上脱字符号。
如果你可以从OneDrive路径中删除空格(空格非常讨厌,特别是在Microsoft命令提示符中),那么你可以通过以下方式更优雅地解决这个问题:
alias cloud2=mklink /J C:\temp\OneDrive_chjensen\$*
< p > < code > $ * 意味着在 cloud 命令之后的所有内容。

根据我上面所说的,实际上我建议...如果可能的话,请过渡到在Cmder中使用PowerShell控制台。这比使用基于doskey的别名要简单得多。我写了一个方法,在此stackoverflow answer中介绍如何将.ps1文件引入到PowerShell控制台中。

我创建了一个示例,其中包含一些PowerShell代码(具体取决于您的PowerShell版本),可用于执行相同的操作,但具有更多的错误检查和灵活性。有关PowerShell符号链接的更多信息,请参见link

此外,请考虑使用$env:USERPROFILE而不是C:\Users\chjensen,使脚本在其他计算机上更易重用(还有,$env:ProgramFiles而不是c:\Program Files)。

function Get-DestPath
{
    [CmdletBinding()]
    param ( [AllowNull()][String] $DestPath )

    if (!$DestPath)
    {
        # set to default
        $DestPath = 'C:\temp\OneDrive - chjensen\'
    }

    return $DestPath
}

function New-SymbolicLinkItem
{
    [CmdletBinding(SupportsShouldProcess=$true)]
    param
    (
         [Parameter(Mandatory=$true)][String] $NewLinkName 
        ,[Parameter(Mandatory=$true)][String] $ItemToLink
        ,[AllowNull()][String] $DestPath
    )

    $DestPath = Get-DestPath -DestPath $DestPath

    Write-Verbose -Message ('New Link: NewLinkName={0}, ItemToLink={1}, DestPath={2}' -f $NewLinkName, $ItemToLink, $DestPath)

    if ($PSCmdlet.ShouldProcess($ItemToLink, 'New-SymbolicLinkItem'))
    {
        try
        {
            New-Item -ItemType SymbolicLink -Path $DestPath -Name $NewLinkName -Value $ItemToLink -ErrorAction Stop
        }
        catch
        {
            ('Error creating link: {0}, line number: {1}' -f $_, $_.InvocationInfo.ScriptLineNumber)
        }
    }
}
Set-Alias -Name cloud -Value New-SymbolicLinkItem

您可以在 PowerShell 控制台中与别名相同地使用此命令:
cloud sublime "C:\Program Files\Sublime Text 3\Data\Packages"

希望这有所帮助。如果您有任何问题,请告诉我。

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