如何使用命令行别名Cmder

问题描述:

我使用Cmder在Windows 10(ConEmu 161206 [64]稳定)来创建使用具有空间路径的结。我想创建一个名为的别名,它创建了一个交叉点。下面是我在Cmder键入:如何使用命令行别名Cmder

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

比方说,我想创建一个名为崇高的链接文件夹,并且目标是我的崇高包在C:\ Program Files文件\崇高的文本3 \ DATA \包 。我试试这个:

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

但该命令会导致以下的输出:

结对C:\中创建用户\ chjensen \ OneDrive - chjensen \崇高< < === >> C:\程序

第一条路径是正确的,但是第二条路径 - C:\ Program - 正在第一个空间被切断。当我尝试访问链接目录时,我显然不能,因为它试图链接到不存在的C:\ Program。

如果我手动编写整个命令它的工作原理:对于C

mklink /J "C:\Users\chjensen\OneDrive - chjensen\sublime" "C:\Program Files\Sublime Text 3\Data\Packages" 

结创建:\用户\ chjensen \ OneDrive - chjensen \崇高< < === >> C:\ Program Files文件\崇高的文本3 \ DATA \包

我已经用实际的命令引号也试过:

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

但我得到了相同的结果。

我在做什么错?

要解决这个问题,你可以使用下面的代码(这是不是一个很优雅的解决方案,但它会很好地工作)。请注意,我用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路径中的空格(空格是邪恶的,尤其是在微软命令提示符),你能解决这个更优雅经:

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

$*意味着cloud后一切命令。

鉴于我上面所说的,我实际上会建议... 如果可能,转换到在Cmder中使用PowerShell控制台。这将比使用基于doskey的别名简单得多'。我写了一个关于我使用的方法来将.ps1文件引入到此计算器中的PowerShell控制台answer

我已经创建了一些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" 

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