كيف يمكنني تعيين متغير بيئة إلى قيمة مع مسافات في ملف دفعي؟

StackOverflow https://stackoverflow.com/questions/1694437

  •  18-09-2019
  •  | 
  •  

سؤال

لا أعرف كيف أصف بالضبط ما أحاول القيام به ولكن هنا ملف دفعي مثال يوضح ما لا يمكنني معرفةه.:

لدي ملف دفعي. داخل هذا الملف الدفعي أحاول إنشاء دليل:

Set CopyFrom = %~dp0

if Exist "%ProgramFiles(x86)" (
  Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces
)

md %TargetDir%\NewSubFolder
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder

ملف الدفعي الخاص بي فشل في الخط 4 Set TargetDir =... مع:

\My was unexpected at this time

أفترض أن هذا لأن لدي مسافات في اسم المسار الخاص بي. اعتقدت أنني يمكن أن ألتف متغير بلدي مع اقتباسات:

Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces"

ولكن بعد ذلك عندما وصل إلى الخط الذي ينشئ الدليل فاش %TargetDir% ملفوف الآن في اقتباسات. md "%TargetDir%"\NewSubFolder

هل يمكن إصلاح ذلك أو يجب أن أكتب VBScript لفرز الأشياء؟

هل كانت مفيدة؟

المحلول

فقط ضع تعبيرك في اقتباسات مثل هذا:

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces"
C:\>echo %TargetDir%
C:\Program Files\My Directory Name has spaces

ملاحظة: ستوسع المتغير داخل علامات الاقتباس، وإذا كان ذلك أيضا مسافات، فسوف يحتاج إلى نقله.

الآن يمكنك اقتباسه لأداء تشغيلك:

md "%TargetDir%\NewSubFolder"

نصائح أخرى

المشكلة المعنية هنا هي ليس المقترح كما اقترح الآخرون، ولكن بدلا من إغلاق الأقواس في متغير البيئة ProgramFiles(x86) هذا يؤدي المحلل في الاعتقاد بأن الكتلة تنتهي قبل الأوان (وقح الذات ترقية).

يقتبس فعل ساعد في هذه الحالة لأنها تجعل المحلل تقفز على الجزء المقتبس بالكامل ويفترض بحق الأقواس التالية لتكون الإغلاق الفعلي. ولكن قد يكون الإصلاح أسهل بكثير من ذلك:

if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces

لماذا استخدام كتلة بين قوسين على الإطلاق إذا كان كل ما تفعله هو وضع أمر واحد بالضبط في ذلك؟

set نفسه لا يحتاج إلى أي اقتباسات، إلا عندما تحتوي حججها على أحرف خاصة مثل <, >, |, & التي قذيفة نفسها مقابض طرحت. إنه ليس باناسيا، على الرغم من أنه يؤدي التعامل مع مدخلات المستخدم أو محتويات الملفات بشكل صحيح بألم في بعض الأحيان.

أيضا، يرجى أبدا وضع مساحات حول = في set أمر. هذا سيؤدي إلى إنشاء متغير بيئة مع اسم تنتهي في الفضاء ومحتوياتها التي تبدأ بمساحة. تم تصحيح ذلك جزئيا في نظام التشغيل Windows 7 عن طريق إنشاء متغير بشكل صامظ مع المساحة في النهاية وواحد دون:

> set foo = bar
> set foo
foo=bar
foo = bar

ولكن في الإصدارات السابقة من Windows، لم يحدث هذا الأمر فقط لا تستخدم المسافات حول = إلا إذا كنت تعرف أن هذا هو ما تريد :-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top