windows - コマンドラインエイリアスを使用して、Cmderでスペースを含むパスを使用してジャンクションを作成する方法

原文 windows command-line alias junction cmder

Windows 10(ConEmu 161206 [64]安定版)でCmderを使用しています。ジャンクションを作成する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

最初のパスは正しいですが、2番目のパス(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"


しかし、同じ結果が得られます。

何が悪いのですか?
答え
この問題を修正するには、次のコードを使用できます(これは非常に洗練されたソリューションではありませんが、適切に機能します)。テストにはホームディレクトリではなく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ベースのエイリアスを使用するよりもはるかに簡単です。このstackoverflow answer.ps1ファイルをPowerShellコンソールにプルするために使用するメソッドについて書きました。

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


これがお役に立てば幸いです。ご不明な点がありましたらお知らせください。
関連記事

python - WindowsでのPylintのインストールに失敗しました

windows - Qt 4.5アプリがWindowsでコンソールウィンドウを開くのはなぜですか?

c# - C#で外部プロセスのスレッドの開始アドレスを取得する

python - 保管されているモデルからスペイシーにロードした後、doc.vectorが機能しない

windows - Windows Bat-システムは指定されたファイルを見つけることができません

windows - VS2015にDirectXヘッダーを含めることはできません

windows - パス接頭辞\ ?? \および\\?\

windows - ファイルへのバッチ出力に中国語の記号が含まれています

python - Python-WindowsにPIPをインストールできません-PIPに一致するディストリビューションが見つかりません

mysql - WindowsとFreeBSDでのMariaDB文字セットと照合順序