Rumah >pembangunan bahagian belakang >C++ >Mengapa Laluan Fail Batch %~dp0 Bertindak Berbeza Apabila Dipanggil daripada C# vs. Terus?
Memahami Percanggahan dalam Rujukan Laluan Fail Kelompok (%~dp0)
Tingkah laku %~dp0
dalam fail kelompok boleh berbeza-beza bergantung pada cara fail kelompok dilaksanakan, khususnya apabila membandingkan pelaksanaan langsung berbanding pelaksanaan daripada program C#. Perbezaan ini timbul daripada cara cmd.exe
mengendalikan pembolehubah %~0
dan pengubahsuainya.
Masalahnya:
Pertimbangkan fail kelompok dengan baris ini:
<code class="language-batch">echo %~dp0 cd Arvind echo %~dp0</code>
Apabila dijalankan secara langsung, menukar direktori kepada "Arvind" tidak menjejaskan output %~dp0
. Walau bagaimanapun, jika fail kelompok yang sama ini dipanggil daripada program C#, echo %~dp0
yang kedua akan mencerminkan direktori baharu ("Arvind").
Punca Punca:
Isu teras terletak pada tafsiran cmd.exe
tentang %~0
. Pembolehubah %~0
, bersama-sama dengan pengubah suai seperti ~d
(huruf pemacu) dan ~p
(laluan), mengakses maklumat daripada perwakilan dalaman fail kelompok yang sedang dijalankan.
Perbezaan penting adalah dalam cara petikan mempengaruhi rujukan dalaman ini. Jika %~0
tidak disebut, rujukan dalaman betul menghala ke laluan penuh fail kelompok. Walau bagaimanapun, jika panggilan ke fail kelompok dipetik (yang biasa berlaku dalam interaksi C#), cmd.exe
menanggalkan petikan, yang berpotensi membawa kepada tafsiran laluan relatif dan bukannya laluan mutlak. Tafsiran laluan relatif ini kemudian berubah berdasarkan direktori kerja semasa.
Penyelesaian:
Untuk Perlaksanaan C#:
cmd /c batchfile.cmd
dan bukannya "cmd /c "batchfile.cmd"
.cmd.exe
mempunyai laluan mutlak yang betul tanpa mengira direktori kerja.Untuk Perlaksanaan Fail Kelompok:
<code class="language-batch">@echo off setlocal enableextensions disabledelayedexpansion call :getCurrentBatchPath myBatchPath echo %myBatchPath% cd Arvind echo %myBatchPath% exit /b :getCurrentBatchPath set "%~1=%~f0" goto :eof</code>
Subrutin ini menggunakan %~f0
(yang sentiasa menyediakan laluan penuh) untuk menyimpan laluan dalam pembolehubah yang ditentukan (myBatchPath
dalam contoh ini). Pembolehubah kemudiannya kekal konsisten walaupun selepas menukar direktori.
Atas ialah kandungan terperinci Mengapa Laluan Fail Batch %~dp0 Bertindak Berbeza Apabila Dipanggil daripada C# vs. Terus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!