21333

[code]

    @echo off
    cd /d %~dp0
    cd
    pause
    
[/code]

このようなバッチファイルを作成し、このファイルを指すシンボリックリンクを別のフォルダに作成しました。  
コマンドプロンプト上でシンボリックリンクを実行すると期待通りシンボリックリンクのあるディレクトリに移動してそのパスが表示されるのですが、Explorer上でダブルクリックして実行すると実ファイルのあるディレクトリに移動してしまいます。  
２行目の`cd /d
%~dp0`はバッチファイルのあるディレクトリに移動するために（ググッて）書いた物ですが、ファイルがシンボリックリンクの時はシンボリックリンクのあるディレクトリに移動してほしいです。  
どうすればExplorerから実行した時もシンボリックリンクのあるディレクトリに移動してくれるでしょうか？


CC BY-SA 3.0
2016-01-26T05:49:23.587
21321
2016-12-07T12:26:58.243
2988
question
windows batch-file
バッチファイルのシンボリックリンクをExplorerから実行する際にカレントディレクトリをシンボリックリンクのあるディレクトリにする方法


explorerはsymbolic linkの実体を起動しているようです。 なのでバッチファイル内で解決する方法は無さそうです。

[code]

    [TOF c:\temp\original.cmd] 
    echo off 
    echo %CMDCMDLINE% 
    pause 
    [EOF] 
    
    mklink c:\test\symlink.cmd c:\temp\original.cmd 
    explorer c:\test\symlink.cmd 
    
    C:\windows\system32\cmd.exe /c ""c:\temp\original.cmd" " 
    続行するには何かキーを押してください . . . 
    
[/code]

もう一段batchファイルをかますとかトリッキーな事をやると何とかなるかもしれませんが綺麗じゃないですねぇ


CC BY-SA 3.0
2016-01-26T09:45:44.437
21333
2016-01-26T09:45:44.437
7343
21321
answer


ショートカットファイルのプロパティから設定できる「作業フォルダー」がそのような用途で使用されているのを見かけることがありますが、今回の状況で使用可能でしょうか？

`%cd%`で取得することができます(参考: [What is the current directory in a batch file? - Stack
Overflow](https://stackoverflow.com/a/4420078/4506703))。

手元のWindows7Pro(x64)及びWindows10Pro(x64)では、この「作業フォルダー」欄を空にすると、`%cd%`はファイルを置いているディレクトリを指しているようです…が、これが想定された挙動なのかは調べきれませんでした。

WindowsXPではまた異なった挙動になるようです。  
参考: [作業フォルダの指定がないとショートカットが既定の作業フォルダから起動する](https://support.microsoft.com/ja-
jp/kb/283065)


CC BY-SA 3.0
2016-01-26T11:10:37.513
21339
2016-01-27T03:39:41.217
2017-05-23T12:38:55.307
-1
2808
21321
answer


%0
に格納された値がエクスプローラーで実行した場合とコマンドプロンプトから実行した場合とで異なるようですが、実行直後はどちらも実行した場所のフォルダを示しているようです(win8.1
と win10 で確認)。

@echo on で実行すると挙動が観察できると思います。

c:\test1\test.bat(実体)  
→ 実行直後は c:\test1  
c:\test2\test.bat(シンボリックリンク)  
→ 実行直後は c:\test2

このため、基本的に移動する必要はないのですが、例えば、カレントディレクトリのパスを処理中に使用したいなどでしたら、以下のような方法ではどうでしょうか。

・カレントディレクトリのパスを処理中に使えるよう変数に格納しておく

[code]

    @echo off
    set exeDir=%cd%
    cd /d %exeDir%
    cd
    pause
    
[/code]

単純に、すべて処理が完了したらカレントディレクトリに戻りたいなどの場合は

[code]

    @echo off
    pushd (移動先のパス)
    ～処理～
    popd
    pause
    
[/code]

とすることで、最終的にカレントディレクトリに帰ってくることができます。


CC BY-SA 3.0
2016-12-07T12:26:58.243
30988
2016-12-07T12:26:58.243
19844
21321
answer