要解決這個問題,你可以使用下面的代碼(這是不是一個很優雅的解決方案,但它會很好地工作)。請注意,我用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"
我希望這會有所幫助。如果您有任何問題,請告訴我。