"C:\test\sample\a.bat"を実行した時 %~dp0 で C:\test\sample\ と展開できるのですが、
この時 C:\test\ というパスを取得するにはどうすればいいでしょうか?
バッチファイルから二つ上のディレクトリのパスを取得する方法を教えていただきたいです。
よろしくお願いします。

A 回答 (3件)

C:\test\ という名前が欲しいのであれば、



set A=%~dp0
set A=%A:~0,-2%
for %%A in (%A%) do set A=%%~dpA
echo %A%

アクセスするだけであれば、他の方のように .. で。

そういう意味では、下記でも良いですね。この場合は、C:\test\ でなく、C:\test が得られます。

pushd %~dp0..
set A=%CD%
popd
echo %A%
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
おかげで全て解決しました!

ifでパスの一致の確認ができそうです。
forの使い方も勉強不足でした・・・

お礼日時:2014/11/17 15:36

%~dp0\..



cd でカレントディレクトリを変更してなければ ..\.. でも同じです。

参考URL:http://pentan.info/server/windows/cmd/dp0.html
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
アクセスには使えましたがsample\..がついてしまい、目的には使えませんでした。
もう少し勉強してまいります。

お礼日時:2014/11/17 15:42

ディレクトリコマンドのヘルプを使いましょう。


dir /?
でオプションの一覧と使い方が表示されます。

そこに記述があったと思うんですけど
一つ上のパスはピリオドを2つ付けると表示されます。
dir ..
二つ上なら
dir ../..
こんな感じ。

あとはdirの出力先を標準出力(コンソール)からテキストファイル(パイプやリダイレクトなどの中間ファイルを含む)にしてフィルタコマンドを使うなどして取得しましょう。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
後から回答してくださった方の方法で解決しましたが、パス取得方法の1つとして知識が増えました。

お礼日時:2014/11/17 15:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC:\Windows> から C:\Windows\Win98>への変更方法

次のMS DOSプロンプトの状態から
C:\Windows>

次のMS DOSプロンプトの状態にしたい。
C:\Windows\Win98>

色々試して見ましたがうまくいきませんので、教えてください。テストした結果は以下の通りです。

C:\Windows> CD \   と入力してEnterします
C:\>CD C:\Windows\Win98  と入力してEnterします

ディレクトリーの指定が違いますと、表示されてうまくいきません。

Aベストアンサー

>C:\>CD C:\Windows\Win98  と入力してEnterします

↑で別に間違ってはいないので、"C:\WINDOWS\win98"ディレクトリが存在しないのでは?

dir c:\windows\win98

で確認してみた方が良いと思います。

QC#でのbatファイル実行結果取得

既存のbatファイルが存在し、C#プログラムより、実行結果コ-ドを取得したいのですが、どうやっても「0」が帰ってきましまい、悩んでいます。 よいアドバイス&指摘を下さい。

<batファイル>
 @echo off
 set RET_CODE=%1
 echo %RET_CODE%
 exit /b %RET_CODE%

<C#プログラム>
 ProcessStartInfo psInfo = new ProcessStartInfo();
 psInfo.FileName = @"D:/app/Send.bat";
 psInfo.Arguments = "45";
 psInfo.CreateNoWindow = true;
 psInfo.UseShellExecute = false;
 psInfo.RedirectStandardOutput = true;
 Process ps= Process.Start(psInfo);
 string st = ps.StandardOutput.ReadToEnd(); ← 何も出ない?
 ps.WaitForExit();
 string rt = ps.ExitCode.ToString(); ← 必ず「0」が返却?

既存のbatファイルが存在し、C#プログラムより、実行結果コ-ドを取得したいのですが、どうやっても「0」が帰ってきましまい、悩んでいます。 よいアドバイス&指摘を下さい。

<batファイル>
 @echo off
 set RET_CODE=%1
 echo %RET_CODE%
 exit /b %RET_CODE%

<C#プログラム>
 ProcessStartInfo psInfo = new ProcessStartInfo();
 psInfo.FileName = @"D:/app/Send.bat";
 psInfo.Arguments = "45";
 psInfo.CreateNoWindow = true;
 psInfo.UseShellExecute = false;
 psInfo.Redi...続きを読む

Aベストアンサー

追記の追記。

psInfo.FileName = @"D:/app/Send.bat";
psInfo.Arguments = "45";
と書くと、実は
psInfo.FileName = @"C:\WINDOWS\SYSTEM32\CMD.EXE";
psInfo.Arguments = @"D:/app/Send.bat 45";
と言うように「CMD.EXEが起動するように、Windowsが小細工をする」のです。

そのため、Send.batは「子プロセスのCMD.EXEが実行」します。

その為
exit /b 終了コード
と書くと、この終了コードは「子プロセスとして動いているCMD.EXEのERRORLEVELになるだけで、CMD.EXEの終了コードにはならない」のです。

そして、Send.batを実行し終わった子プロセスのCMD.EXEは「これ以上、もう、何もする事がなく、正常終了してしまう」ので「正常終了時の終了コードとして0で終了」します。

終了コードが0で終了すれば、当然
ps.ExitCode
の値は「常に0」です。

そういう訳で「子プロセスとして動いているCMD.EXEを終了させ、終了コードを持たせる」には
exit 終了コード
と書いて「/b無しのexitコマンドを実行」しなければなりません。

こうすれば「Send.batを起動した子プロセスのCMD.EXEの終了コードが、exitコマンドで指定した値になる」のです。

exitコマンドで指定した値が終了コードになれば、当然
ps.ExitCode
の値も「引数で渡した値」になります。

追記の追記。

psInfo.FileName = @"D:/app/Send.bat";
psInfo.Arguments = "45";
と書くと、実は
psInfo.FileName = @"C:\WINDOWS\SYSTEM32\CMD.EXE";
psInfo.Arguments = @"D:/app/Send.bat 45";
と言うように「CMD.EXEが起動するように、Windowsが小細工をする」のです。

そのため、Send.batは「子プロセスのCMD.EXEが実行」します。

その為
exit /b 終了コード
と書くと、この終了コードは「子プロセスとして動いているCMD.EXEのERRORLEVELになるだけで、CMD.EXEの終了コードにはならない」の...続きを読む

QbatファイルUSBで始まってC:で終わりたい

USBにbatファイルを入れると私の場合 F:ドライブになります。
USBファイルにバッチファイルを入れ実行すると 最後F:¥で終わります。

それを最後を 例えばC:\ とかで終わりたい

すみませんが教えてください

Aベストアンサー

No4ですが、ちなみにですが、

wmic logicaldisk where (VolumeName='[ボリュームネーム]') get DeviceID,VolumeName,DriveType,VolumeSerialNumber /format:list

とするとドライブレターが取得できます。ボリューム名を付けておけばの話です。wmic は、初めて実行する時はインストールを始めます。とでてきます。これは環境を整えるだけで、元々XP以降は設置されています。

他にも、

>echo list volum> a.txt
>diskpart /s a.txt

で取得可能。いずれも”管理者で実行”モードで実行する必要があります。ショートカットをUSBドライブに作っておき、Autorun.inf 等に登録するだけ

まあ、BATでの起動パス取得は、簡単にできるので、あくまでも、ちなみにです。

Qruby "\001\376".unpack("C*") => [1, 254]の意味

"\001\376".unpack("C*") => [1, 254] の
[1, 254]ってどういう数字を意味するのですか?8ビット整数なのに配列で結果が出ていることの意味がわかりません。ご教授ください。

Aベストアンサー

"\001\376"
は、バイナリ文字列で
"C*"

バイトとして数値を取り出し配列にする
ということだと思います。
\376は、8進数で、10進にすると254になります。
見当違いだったらすみません。

QDosバッチでファイルパスからフォルダパス取得

Dosバッチで引数指定されるファイルパスからフォルダパス部分を抜き出したいと思っています。

例)----------------------------------------------
「C:¥hoge1¥hoge2¥a.txt」が引数で指定されてきた場合、
「C:¥hoge1¥hoge2¥」の部分を変数に格納したい
-----------------------------------------------

ちなみに、指定されてくるパスは不規則です。

どなたか良い方法をご存知でしたらご教授宜しくお願い致します。

Aベストアンサー

わざわざ 2回参照するまでもなく
%~dp1
でよかったりします>#2.


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報