2017-09-20 74 views
1

我使用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" 

但我得到了相同的結果。

我在做什麼錯?

回答

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路徑中的空格(空格是邪惡的,尤其是在微軟命令提示符),你能解決這個更優雅經:

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" 

我希望這會有所幫助。如果您有任何問題,請告訴我。