একটি উইন্ডোজ cmd-file (ব্যাচ-ফাইল) 32 বিট হিসাবে "ঘোষণা" করা সম্ভব?


7

পটভূমি:

আমরা বেশ কিছু স্ক্রিপ্টিং এবং ব্যাচ ফাইল সহ সামান্য সাহায্যকারীরা ( xyz.cmd ) কাজ। উইন্ডোজ 7 এখন শুধুমাত্র বিস্তৃত হতে শুরু করেছে, এবং স্পষ্টতই, আমরা 32 বিবিসি বনাম 64 বিট উইন্ডোজের বিভিন্ন পরিবেশের ভেরিয়েবলগুলির সাথে যুক্ত সমস্যাগুলিকে আঘাত করি।

বিশেষত, যদি আপনি চালানো C:\Windows\system32\cmd.exe একটি 64 বিট উইন্ডোজ, আপনি পাবেন:

...
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
...

যদি আপনি শুরু করেন C:\Windows\SysWOW64\cmd.exe একটি 64 বিট উইন্ডোজ, আপনি পাবেন:

...
ProgramFiles=C:\Program Files (x86)         <-- NOTE
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
...

এটি এমনও ঘটে, যেহেতু এই cmd.exe একটি 32 বিট প্রক্রিয়া, এটি অন্যান্য সমস্ত SysWOW64 পুনঃনির্দেশগুলি "বিনামূল্যে জন্য" পায় - যেকোনও আমন্ত্রণ regedit 32bit রেজিস্ট্রি, ইত্যাদি যেতে হবে

ব্যাচ ফাইলটি 32bit অ্যাপ্লিকেশনের সাথে সম্পর্কিত কিছু কাজ করতে অনুমিত হলে এটি অত্যন্ত উপকারী হতে পারে, উদাঃ। পথ + রেজিস্ট্রি স্টাফ।

প্রশ্ন:

GIven যে আমার ব্যাচ ফাইলগুলির একটি শ্রেণী রয়েছে যা আমি 32bit সংস্করণে সর্বদা চালাতে চাই cmd.exe, একটি আছে - সহজ! - উইন্ডোজ 64 বিট সংস্করণগুলিতে এই ব্যাচ ফাইলগুলিকে সর্বদা 32 বিট cmd.exe ব্যবহার করতে এবং Windows এর 32bit সংস্করণগুলিতে সাধারণত চালানোর উপায় কী?

স্পষ্টত আমি পরিবেশের ভেরিয়েবলগুলি পরিবর্তন করতে এবং প্রতিনিয়ত আমন্ত্রণগুলি এবং / অথবা প্রতিস্থাপনের জন্য যেমন প্রতিটি ব্যাচ-ফাইলে "হেডার" যোগ করতে পারি স্পষ্টত আমি শুধু ব্যবহারকারীকে বলতে পারি "এই ব্যাচ ফাইলটি SysWOW64 cmd.exe এর মাধ্যমে চালান", তবে এই সমাধানগুলিও খুব আকর্ষণীয় বলে মনে হচ্ছে না :-)


2
আপনি 63-বিট উইন্ডোজ উল্লেখ করুন, আপনার প্রশ্ন সম্পাদনা করুন, তাই আপনার 64-বিট সম্পর্কে কথা বলা অবশ্যই অবশ্যই আপনার C: \ Windows \ system32 \ cmd.exe কল করা উচিত এবং আপনার ব্যাচ কমান্ডটি কীভাবে বেস করা উচিত তা চিহ্নিত করে অস্তিত্ব সি: \ প্রোগ্রাম ফাইল (x86) ** বা না। ** সি: \ প্রোগ্রাম ফাইল (x86) উইন্ডোজ 7 এর 32-বিট ইনস্টলেশনের উপর বিদ্যমান নেই।
Ramhound

1
@ রামহাউন্ড - আপনি সম্পূর্ণভাবে বিন্দু মিস করবেন। এই ব্যাচ ফাইলগুলি "32 বিট ব্যাচ ফাইল"। হয় তৈরি সম্পর্কিত উপাদান 32 বিট অ্যাপ্লিকেশন। (আমি ইতিমধ্যে প্রশ্নে ব্যাখ্যা করেছি।) উইন্ডোজগুলি ইতিমধ্যেই প্রয়োজনীয় সকল প্রয়োজনীয় "পরিসংখ্যান-আউট" নিয়ে আসে এবং যখন আমি 32 বিবিসি সংস্করণ cmd.exe ব্যবহার করি তখন এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হয়। এখন, কী চমৎকার হবে উইন্ডোজকে স্বয়ংক্রিয়ভাবে এটি ব্যবহার করতে সক্ষম হতে পারে। এই প্রশ্নটি সবই ঠিক আছে, যেমনটা আমি মনে করি আমি ইতিমধ্যে প্রশ্নে খুব খোলাখুলিভাবে ব্যাখ্যা করেছি।
Martin

1
@ মার্টিন, তাহলে কেন শুধু কঠোর কোড নয়? যদি বিদ্যমান থাকে তবে "c: \ program files (x86)" তারপর prog == c: \ program files (x86), else prog == c: \ program files ... বা অনুরূপ।
William Hilsum

উত্তর:


11

আপনার সমস্যার জন্য আমার তিনটি সম্ভাব্য সমাধান আছে:

1) একটি আবর্জনা ব্যাচ ফাইল ব্যবহার করুন

আমি যে কোম্পানির জন্য কাজ করতাম, তার মধ্যে আমরা যা যাচ্ছিলাম তার জন্য আমাদের একটি একক রেপার ব্যাচ ফাইল ছিল। আমরা আমাদের ব্যবহারকারীদের সাথে মিথস্ক্রিয়া সহজ করার জন্য এটি করেছি, কিন্তু এটি একইভাবে কাজ করবে। আপনি যদি চেয়েছিলেন তবে আপনি প্রতিটি ব্যাচ ফাইলের জন্য একটি রপার তৈরি করতে পারেন (মূলত, দুটি ব্যাচ ফাইল তৈরি করুন), অথবা একটি একক মোড়ক তৈরি করুন যা আপনাকে মেনু থেকে প্রতিটি ব্যাচ ফাইল নির্বাচন করতে দেয়। http://http-server.carleton.ca/~dmcfet/menu.html )। আপনি প্রতিটি মেনু নির্বাচন চালানোর জন্য ব্যাচ ফাইলের পথ চিহ্নিত করতে পারেন এবং তারপরে আপনি এটির সাথে আরম্ভ করার জন্য মোড়কটি সঠিক cmd.exe চয়ন করতে পারেন।

2) একটি স্ব-wrapper হিসাবে ব্যাচ ফাইল ব্যবহার করুন

প্রতিটি ব্যাচ ফাইলের জন্য, আপনি একটি হেডার অন্তর্ভুক্ত করতে পারেন যা আপনি কোন OS (32 বা 64-বিট) নির্ধারণ করেন তা নির্ধারণ করে। আপনি যদি 64-বিট ওএসে থাকেন তবে ডিফল্টরূপে আপনি এটি 64-বিট সংস্করণ cmd.exe ব্যবহার করে চালু করছেন। আপনি সেই ফাইলটির সাথে একই ক্যাচ ফাইলের সাথে 32 ডি-বি সংস্করণ cmd.exe চালু করতে পারেন তবে আপনি ব্যাচ ফাইলটি একটি পতাকাও পাস করতে পারেন যা এটি 64-বিট চেকটি উপেক্ষা করতে বলে। তারপর সঠিক 32-বিট cmd.exe অধীনে চালানো হবে।

উদাহরণ স্বরূপ:

@ECHO Off

::Check if 64-bit check skip flag exists

IF %1 == /skipcheck (goto run)

::Check if OS is 64-bit

IF %processor_architecture%==AMD64 (<path_to_32-bit_cmd> /c "<path_to_batch_file>\<name_of_my_batch_file>" /skipcheck)
IF %processor_architecture%==AMD64 (goto end)

:run

echo Hello World!

:end

আমি উপরের কোডটি পরীক্ষা করে দেখিনি, তাই আমার ভুল কোটগুলিতে কিছু উদ্ধৃতি বা বন্ধনী থাকতে পারে, তবে এটি সাধারণ ধারণা।

3) স্থানান্তর করুন শক্তির উৎস

PowerShell সমস্ত উইন্ডোজ অপারেটিং সিস্টেম এক্সপি এবং নতুন জন্য উপলব্ধ। PowerShell মাইক্রোসফ্ট দ্বারা অবশেষে সহজ cmd.exe প্রতিস্থাপন করার জন্য ডিজাইন করা হয়েছে এবং প্রায় কোনও কাজ করার জন্য সমৃদ্ধ ভাষা সরবরাহ করে। সর্বাধিক ব্যাচ প্রোগ্রামগুলি পাওয়ারশেলে আসলে চালানো যায় এবং সর্বাধিক টাওয়ারিংয়ের প্রয়োজন হতে পারে।


1
স্ব-wrapper পদ্ধতির একটি ভাল সমাধান মনে হয়!
Martin

আমি সবসময় ইমপ্রেশন ছিল যে PowerShell cmd থেকে খুব ভিন্নভাবে কাজ করে। আমি সত্যিই Powershell থেকে স্বাভাবিক cmd কমান্ড চালাতে পারেন ??
Martin

এক বিন্দু থেকে, পাওয়ারশেল হয় cmd থেকে খুব ভিন্ন। যাইহোক, মাইক্রোসফট CMD থেকে সম্ভব অধিকাংশ কমান্ড এবং কল সঙ্গে পাওয়ারশেল সামঞ্জস্যপূর্ণ করেছে। এতে কয়েকটি * নিক্স কল (যেমন ls) যোগ করা হয়েছে, পাশাপাশি cmdlets ব্যবহার করে সম্ভাবনার বিশ্বেও প্রসারিত হয়েছে। স্পষ্টতই, আপনি যদি মাইগ্রেট করেন তবে কোনও কোডটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করতে চান তবে আপনার যে পরিবর্তনগুলি করা উচিত তা সর্বনিম্ন হওয়া উচিত।
Nick2253

কিভাবে # 2 কিভাবে করবেন?
rogerdpack

উপরে উদাহরণ দেখুন। সত্যিই এটি করার এক হাজার এবং এক উপায় আছে, তবে আপনার প্রশ্নটি দেখে আমি একসঙ্গে চুপ করে আছি।
Nick2253

4

আপনি স্পষ্টভাবে cmd.exe সংস্করণটি চালাতে চান এবং এটি আপনার ব্যাচ ফাইলটি চালানো উচিত:

64 বিট কার্যকর করার জন্য: C:\Windows\system32\cmd.exe /C path\to\batchfile.cmd
32 বিট কার্যকর করার জন্য: C:\Windows\SysWOW64\cmd.exe /C path\to\batchfile.cmd

দ্য / সি পরামিতি সরবরাহকৃত কমান্ড এবং সমাপ্তি কার্যকর করে । (হ্যাঁ, এটি এক্সপি ডকুমেন্টেশন একটি লিঙ্ক)।


1

আমি আরো কার্যকর এবং সার্বজনীন হতে র্যাপারটি পুনরায় লিখছি, শুধু হেডার ডাম্প করে যান এবং যান, কনফিগার করার জন্য কিছুই নেই।

এই পরিস্থিতিতে এই গ্রহণযোগ্য উত্তরগুলি হ্যান্ডেল করবে না:

  • "প্রসেস আর্কিটেকচার" পরিবর্তনশীল (পুরানো এক্সপি এর চেয়ে) উইন্ডোজ 10 এর মাধ্যমে।
  • X86 বা x64 সিস্টেমে চলমান
  • "সি: \ উইন্ডোজ" ছাড়া ড্রাইভ এবং পাথগুলিতে ওএস ইনস্টল হচ্ছে
  • স্বয়ংক্রিয়ভাবে পুনরায় চালানোর জন্য স্ক্রিপ্টের নাম এবং পথ পাচ্ছেন।
  • চালানো হয় যে নতুন পুনরাবৃত্তি সমস্ত কমান্ড লাইন আর্গুমেন্ট পাস।

শুধু হেডার ডাম্প এবং যান।

REM \/ HEADER TO ENSURE 32 Bit CLI \/
@(
    SETLOCAL
    ECHO OFF
    REM check for Only state where we are not in a 32 bit CMD
    ECHO."%PROCESSOR_ARCHITECTURE%_%ProgramFiles%" | FIND /I "AMD64_" | FIND /I /V "86"  >NUL && (
        CALL "%SystemRoot%\SysWOW64\cmd.exe" /c ""%~f0" %*"
        GOTO :EOF
    )
)
REM /\ HEADER TO ENSURE 32 Bit CLI /\

REM YOUR CODE HERE

(
   ENDLOCAL
   EXIT /b
)

-3

32 বিট মেশিনে তৈরি .com ফাইলগুলি শুধুমাত্র 32 বিট মেশিনে চালিত। যদি আপনি এটি EXE ফাইল হিসাবে কম্পাইল করেন তবে তার .com এ এক্সটেনশানটি পুনঃনাম করুন, তারপরে কেবলমাত্র 32 বিট মেশিন এটি চালাতে পারে।

আপনার ক্রমাগত স্ক্রিপ্টটি সম্পাদনা করলে এটি খুব সহায়ক নয়, তবে আমি মনে করি এটি সর্বোত্তম পদ্ধতি, কারণ এটি আপনার কোডটিও লুকিয়ে রাখে।


1
এই উত্তর সঠিক নয় । আমি 64 বিট উইন্ডোজ এবং প্রোগ্রাম উইন্ডোজ \ system32 তে চলছি যেমন format.com এবং tree.com ঠিক সূক্ষ্ম।
DavidPostill

1
কি .com নথি পত্র? এই জন্য একটি এক্সটেনশান 16 বিট ডস অ্যাপ্লিকেশন। এটা একেবারে OP এর সমস্যা কোন সম্পর্ক আছে।
Daniel B

1
হাই। আমি আপনার উত্তর অবতরণ করছি কারণ আমি মনে করি এটি সম্পূর্ণভাবে বিন্দু ছাড়াও।
Martin

1
তিনি সঙ্গে কাজ করতে চায় .bat ফাইল, তাদের কম্পাইল না। তিনি যদি 16-বিট তাদের কম্পাইল করা হয় .com অ্যাপ্লিকেশন, 32-বিট তাদের চলমান সঙ্গে যে কিভাবে সাহায্য করবে cmd.exe একটি 64-বিট সিস্টেমে? তারা আর দৌড়াবে না! আপনার ধারণা সহজভাবে একটি অ সমাধান।
Daniel B

1
প্রথমত, আমার মনে হয় আপনি ভুল বুঝেছেন যে আমি "32 বিট মেশিনে চালাতে চাই"। আমি 64bit অপারেটিং সিস্টেমের সাথে চলমান সাথে ভাল আছি, ঠিক একটি 32 বিট প্রসঙ্গে চালানো উচিত। তাই যদি আমি কিছু কম্পাইল করতে পারতাম, তাহলে 32 বিবিসি এক্স ফাইলটি ঠিক হবে, কোনটির দরকার নেই com ফাইল।
Martin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.