2

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

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

假设我想创建一个名为 Sublime 的链接文件夹,目标是我在C:\Program Files\Sublime Text 3\Data\Packages的 Sublime 包。我试试这个:

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

但是该命令会产生以下输出:

为 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"

但我得到了同样的结果。

我究竟做错了什么?

4

1 回答 1

0

要解决此问题,您可以使用以下代码(这不是一个非常优雅的解决方案,但它会很好地工作)。请注意,我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 cmd 提示符下),您可以通过以下方式更优雅地解决这个问题:

alias cloud2=mklink /J C:\temp\OneDrive_chjensen\$*

$*表示命令之后的所有内容cloud

鉴于我上面所说的,我实际上会建议...... 如果可能的话,过渡到在 Cmder 中使用 PowerShell 控制台。这将比使用基于 doskey 的别名简单得多。我.ps1在这个 stackoverflow答案中写了一个用于将文件拉入 PowerShell 控制台的方法。

我创建了一个 PowerShell 示例,您可以使用它(取决于您的 PowerShell 版本)来做同样的事情,但具有更多的错误检查和灵活性。有关 PowerShell 符号链接的更多信息,请参阅此链接

此外,考虑使用$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"

我希望这个对你有用。如果您有任何问题,请告诉我。

于 2017-10-07T05:02:33.633 回答