Rumah >pembangunan bahagian belakang >C++ >Mengapa Laluan Fail Batch %~dp0 Bertindak Berbeza Apabila Dipanggil daripada C# vs. Terus?

Mengapa Laluan Fail Batch %~dp0 Bertindak Berbeza Apabila Dipanggil daripada C# vs. Terus?

Linda Hamilton
Linda Hamiltonasal
2025-01-09 21:51:42187semak imbas

Why Does the %~dp0 Batch File Path Act Differently When Called from C# vs. Directly?

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#:

  • Elakkan Memetik: Penyelesaian paling mudah ialah mengelak daripada menggunakan petikan apabila memanggil fail kelompok daripada C#. Gunakan arahan seperti cmd /c batchfile.cmd dan bukannya "cmd /c "batchfile.cmd".
  • Gunakan Laluan Penuh: Jika petikan tidak dapat dielakkan, sentiasa berikan laluan penuh ke fail kelompok dalam panggilan C#. Ini memastikan cmd.exe mempunyai laluan mutlak yang betul tanpa mengira direktori kerja.

Untuk Perlaksanaan Fail Kelompok:

  • Pendapatan Laluan Teguh: Pendekatan yang paling boleh dipercayai dalam fail kelompok itu sendiri ialah menggunakan subrutin untuk mendapatkan laluan skrip semasa. Kaedah ini memintas ketidakkonsistenan yang disebabkan oleh petikan dan perubahan direktori:
<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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn