如何使用命令行别名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"
我希望这会有所帮助。如果您有任何问题,请告诉我。