উইন্ডোজ কমান্ড প্রম্পট: কীভাবে আমি একটি কমান্ডের আউটপুটটিকে পরিবেশের ভেরিয়েবলের মধ্যে পেতে পারি?


59

আমি একটি পরিবেশের পরিবর্তনশীল রাখতে চাই যা সেন্টিমিডেক্সে সপ্তাহের দিন থাকে।

আমি যখন এই কমান্ডটি চালনা করি তখন আমার ফলাফলটি পেতে চাই get

C:\Users\tisc> powershell (get-date).dayofweek
Friday

এখানে আমি ফলাফলটি পরিবেশে পরিবর্তনশীল হিসাবে সংরক্ষণ করার চেষ্টা করছি।

C:\Users\tisc> set dow = powershell (get-date).dayofweek

কিন্তু যখন আমি এটি পাওয়ার চেষ্টা করি তখন আমার মতো স্ট্রিংটি পাই না।

C:\Users\tisc> set dow
DoW=0
dow = powershell (get-date).dayofweek

আমার লক্ষ্যটি কিছু ব্যাকআপ স্ক্রিপ্টগুলির জন্য ব্যাচ ফাইলে ভেরিয়েবলটি ব্যবহার করা use

উত্তর:


87

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

$env:DOW = "foo"

3
আমি বুঝতে পারছি না কেন এইটিকে নেতিবাচকভাবে পতাকাঙ্কিত করা হয়েছিল, আপনি কি পরিবেশের ভেরিয়েবল সেট করা আরও ভাল জানেন?
অয়ন টোডেরেল

2
+1 এটি আমার প্রয়োজনের দৃশ্যে আমার পক্ষে দুর্দান্ত কাজ করে। PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
ডেভিড রুহমান

14
@ আইওনডোডিরেল কারণ এটি কেবল প্রক্রিয়া জায়গাতেই থাকে।
জনড

অবশেষে আমি এখন বুঝতে পারি কীভাবে RAILS_ENV কে পাওয়ার পাওয়ারে সেট করা যায়

এবং তারপরে আপনি কীভাবে এটি কাজ করে তা নিশ্চিত করার জন্য আউটপুট করবেন?
কোডি বাগস্টিন

22

পাওয়ারশেলতে আপনার দুটি কমান্ড চালানো উচিত কারণ পাওয়ারশেল পরিবেশগত ভেরিয়েবলগুলি পরিচালনা করতে সক্ষম।

অর্থাৎ,

$dow = (get-date).dayofweek
[Environment]::SetEnvironmentVariable("DOW", $dow, "Machine")

অথবা

[Environment]::SetEnvironmentVariable("DOW", $dow, "User")

যাইহোক, আপনার স্ক্রিপ্টটি কাজ করে না কারণ আপনি যা পাচ্ছেন তা হ'ল পাওয়ারশেল রিটার্ন কোড, এটি তৈরি করা ডেটা নয়। এটির কাজ করার একটি উপায় থাকতে পারে তবে এটি কেবলমাত্র একটি সঠিক পাওয়ারশেল স্ক্রিপ্ট ব্যবহারের সাথে তুলনা করে অর্থহীন।

সম্পূর্ণতার জন্য, পাওয়ারশেল এবং পরিবেশগত ভেরিয়েবলগুলির জন্য মাইক্রোসফ্টের একটি দুর্দান্ত নিবন্ধ এখানে:

পরিবেশ পরিবর্তনশীলগুলি তৈরি এবং সংশোধন করা

আপডেট: চ্যাটটিতে @ সিনেটিকন-ডিজে-এর সাথে এই সমাধানটি পর্যালোচনা করে দেখা যাচ্ছে যে আপনি এই পদ্ধতিটি ব্যবহার করে যে সমস্যার মুখোমুখি হচ্ছেন তা হ'ল পরিবেশগত ভেরিয়েবলের যে পরিবর্তনগুলি বাহ্যিকভাবে ঘটেছিল তা প্রতিফলিত করার আগে একটি কমান্ড প্রম্পট পুনরায় লোড করতে হবে।

আপনি কী করছেন এটি সম্পর্কে আপনি খুব বেশি বিশদ সরবরাহ করেননি, তবে আপনি যদি পাওয়ারশেলটি চালু করছেন কেবল যদি এই কারণটি হয় তবে আমার আসল পরামর্শটি আপনাকে কীভাবে কাজ করছে তা পর্যালোচনা করা উচিত।

হয় আপনার পুরো প্রক্রিয়াটি পাওয়ারশেল ব্যবহার করে বা আপনি তফসিল কাজগুলি ব্যবহারের পরিবর্তে বিবেচনা করেছেন? আপনি সপ্তাহের দিনের উপর ভিত্তি করে কাজগুলি শিডিউল করতে পারেন।


ব্যাচ ফাইলটি প্রতিদিন চালানো হবে এবং নির্ধারিত কাজগুলি থেকে চালিত হবে। আমি পরিবর্তে পাওয়ারশেলে কাজ করার কথা ভাবছি। তবে আমি পাওয়ারশিতে সেন্টিমিটারের চেয়েও বেশি নবীন। এবং এখনই আমার একটি সহজ কমান্ড নিয়ে সমস্যা হচ্ছে difficulties তবে আমি সে সম্পর্কে একটি নতুন প্রশ্ন করতে পারি, এটি সম্ভবত আপনার পক্ষে একটি সহজ :) সম্পাদনা: আমি এটি আবিষ্কার করেছি। এটি ছিল কীভাবে কিছু পরামিতি সহ একটি প্রোগ্রাম চালাবেন।
টিম

আমি পাওয়ারশেলের ক্ষেত্রেও দুর্দান্ত নই, তবে এটি শেখার পক্ষে ভাল। একটি সূচনার জন্য এটি প্রায় প্রতিটি উপায়েই আরও ভাল, তবে এটি মাইক্রোসফ্ট (এবং তাই অন্য নির্মাতারা) যেভাবে চলছে।
ড্যান

1
এছাড়াও, নোট করুন যে উপরে @ ড্যানের পরামর্শটি পরিবেশের পরিবর্তনশীলগুলি স্থায়ীভাবে স্থির করে দেয় (মেশিনে বা ব্যবহারকারী প্রসঙ্গে)। আপনি যদি তৃতীয় প্যারামিটারটি ছেড়ে দেন তবে আপনি এটি কেবলমাত্র বর্তমান প্রক্রিয়ার জন্য সেট করতে পারেন যা কখনও কখনও আরও বেশি পছন্দসই হয়।
প্রতি লন্ডবার্গ

20

আমি PowerShell মধ্যে থেকে এনভায়রনমেন্ট ভেরিয়েবল সেট বিশ্বাস [Environment]::SetEnvironmentVariableযেমন ড্যান দ্বারা প্রস্তাবিত, অর্থহীন, কারণ আপনি হয় PowerShell অবসান উপর পরিবর্তনশীল বিষয়বস্তু হারাবে যদি তোমরা সাময়িকভাবে "প্রক্রিয়া" প্রসঙ্গ বেছে নেওয়া হয়েছে বা এটিকে আপনার ব্যাচ ফাইলের পরিবেশের মধ্যে হতো না এখনো যদি আপনি স্থায়ী "মেশিন" বা "ব্যবহারকারী" প্রসঙ্গটি বেছে নিয়ে থাকেন - এটি হ'ল যদি আপনার পুরো স্ক্রিপ্টটি পাওয়ারশেলে না লেখা হয়, যেখানে সমস্যাটি প্রথম স্থানে দেখা না দেয়:

C:\Users\myuser> echo %DOW%
%DOW%

C:\Users\myuser> powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

PS C:\Users\myuser> $dow = (get-date).dayofweek
PS C:\Users\myuser> [Environment]::SetEnvironmentVariable("DOW", $dow, "User")
PS C:\Users\myuser> [Environment]::SetEnvironmentVariable("DOW", $dow, "Process")
PS C:\Users\myuser> exit

C:\Users\myuser> echo %DOW%
%DOW%

C:\Users\myuser>

আপনি forআপনার পাওয়ারশেল কমান্ডের আউটপুটকে বিশ্লেষণ করতে এবং এটিকে একটি ভেরিয়েবলের মধ্যে রাখার জন্য কমান্ডটি workaround হিসাবে ব্যবহার করতে পারেন :

  for /F "usebackq tokens=1" %%i in (`powershell ^(get-date^).dayofweek`) do set DOW=%%i

^আপনার পাওয়ারশেল কলের মধ্যে প্রথম বিশেষ অক্ষরগুলি পালাতে ব্যবহৃত ক্যারেট অক্ষরগুলি নোট করুন ।

আপনি যদি এটি কমান্ড লাইন থেকে পরীক্ষা করে দেখেন এবং কোনও ব্যাচের ফাইলের প্রসঙ্গে নয়, আপনার %%আগে ভেরিয়েবল রেফারেন্সগুলি এর দ্বারা প্রতিস্থাপন করতে হবে %:

C:\Users\myuser> for /F "usebackq tokens=1" %i in (`powershell ^(get-date^).dayofw
eek`) do set DOW=%i

C:\Users\myuser> set DOW=Friday

C:\Users\myuser>

না, এটি ভুল। নীচের আমার উদাহরণটি 'স্বাভাবিক' পরিবেশগত পরিবর্তনশীলগুলি সেট করে যা কোনও ব্যাচের ফাইল ইত্যাদি থেকে অ্যাক্সেসযোগ্য
ড্যান

@ ড্যান আমি বিশ্বাস করি যে আপনি ভুল করেছেন, আমি [Environment]::SetEnvironmentVariable("DOW", $dow, "user")একটি চলমান পাওয়ারশেল অধিবেশন থেকে সেট করার চেষ্টা করেছি কিন্তু পাওয়ারশেলের সমাপ্তির পরে এটি আমার পিতামাতার সিএমডি অধিবেশনটিতে উপস্থিত ছিল না
দ্য ওয়াববিট

ফর্ম্যাটিংটি এটিকে ঘৃণা করেছে, তবে আপনি ডাউটি সংজ্ঞায়িত করেন নি। পাওয়ারশেল স্ক্রিপ্টে আমার উদাহরণ চালানো প্রত্যাশার মতো একটি স্বাভাবিক পরিবেশগত পরিবর্তনশীল সঞ্চয় করে।
ড্যান

1
@ ড্যান বিটিডাব্লু: আমি নিম্নগতির বিষয়ে কিছু মনে করি না, তবে এটি অবশ্যই লক্ষ করা উচিত যে বিক্ষোভকারী পদ্ধতিটি প্রশ্নকর্তার কাছে যা চেয়েছিল তা স্পষ্টভাবেই করে , তাই যদি আরও মার্জিত দৃষ্টিভঙ্গি ছিল, তবুও এটি সমস্যার বৈধ সমাধান হতে পারে।
দ্য ওয়াববিট

1
@ দ্য ওয়াববিট যা উইন্ডোজের স্বাভাবিক আচরণের মতো বলে মনে হচ্ছে। এমনকি আপনি বৈশ্বিক পরিবেশের ভেরিয়েবলগুলি আপডেট করলেও, আপডেটের পরে শুরু হওয়া প্রক্রিয়াগুলি পরিবর্তনটিকে স্বীকৃতি দেবে। যেহেতু আপনি একটি অভিভাবক প্রক্রিয়া সম্পর্কে কথা বলছেন , অবশ্যই এটি পরিবর্তনের আগেই শুরু করা উচিত ছিল। SETকমান্ড প্রম্পটেও একই ঘটনা ঘটে । একটি শিশু শুরু করার চেষ্টা করুন cmd.exeএবং আপনি একই জিনিস দেখতে পাবেন। আপনি পাওয়ারশেলের সাথে যে আচরণটি দেখছেন তা হ'ল কারণ। নেট ক্লাসের মাধ্যমে এনভায়রনমেন্ট ভেরিয়েবল আপডেট করা বর্তমান প্রক্রিয়াটিকে প্রভাবিত করে না।
jpmc26

4

যদি আমাকে ছিল, এবং পিতা বা মাতা স্ক্রিপ্ট হয়েছে একটি শেল স্ক্রিপ্ট হতে, আমি শুধু মত .CMD লিপিতে PowerShell একটি নির্লজ্জ আবাহন করতে চাই:

set DOW=
for /f %%D in ('%SystemRoot%\System32\WindowsPowerShell\V1.0\powershell.exe -NoLogo -NoProfile -Command Write-Host -Object ^(Get-Date^).DayOfWeek;') do set DOW=%%D

আপনার পাওয়ারশেল এক্সিকিউশন নীতি (সেট-এক্সিকিউশনপলিসি সেমিডলেট) পরীক্ষা করতে হবে।


3

বা আপনি যদি পুরানো শেলের সাথে এটি করতে বিবাহিত হন তবে পাওয়ারশেল পুরোপুরি এড়িয়ে যান।

% তারিখ% পরিবর্তনশীল ব্যবহার করুন এবং এটি যে সংক্ষিপ্তসার দেয় তা থেকে দিনটি প্রসারিত করুন (এটি আঞ্চলিক তারিখের ফর্ম্যাট সেটিংস দ্বারা প্রভাবিত হতে পারে):

C:\> echo %date%
Thu 09/05/2013

উত্তরে প্রথম টোকেনটি ধরুন এবং এতে প্রসারিত করুন:

C:\> type dayofweek.cmd
@echo off
for /f %%A in ("%date%") do set DAYOFWEEK=%%A
if "%DAYOFWEEK%" == "Mon" set DAYOFWEEK=Monday
if "%DAYOFWEEK%" == "Tue" set DAYOFWEEK=Tuesday
if "%DAYOFWEEK%" == "Wed" set DAYOFWEEK=Wednesday
if "%DAYOFWEEK%" == "Thu" set DAYOFWEEK=Thursday
if "%DAYOFWEEK%" == "Fri" set DAYOFWEEK=Friday
if "%DAYOFWEEK%" == "Sat" set DAYOFWEEK=Saturday
if "%DAYOFWEEK%" == "Sun" set DAYOFWEEK=Sunday
echo.%DAYOFWEEK%
C:\>
C:\> dayofweek
Thursday

1
উইন্ডোজ 10% ডেট% -তে DOW প্রদর্শন করবে না: এইচ: \> প্রতিধ্বনি% তারিখ% 20/03/2019
রাউল সালিনাস-মন্টেইগুডো

1

আসলে, একটি .ps1 ফাইলে নীচের মতো কিছু স্থাপন করার সময় (বলুন t.ps1) এবং পাওয়ারশেলের সাথে সিএমডি অধিবেশন থেকে কল করার সময় -File t.ps1... এটি ভাল কাজ করে।

$DateAndTime = (get-date -UFormat "%Y%m%d_%H%M%S")[Environment]::SetEnvironmentVariable("DateAndTime", $DateAndTime, "Machine")

তবে সিএমডি অধিবেশনের জন্য নয় যেখানে t.ps1 স্ক্রিপ্টটি কল করা হয়েছে। একটি নতুন সিএমডি অধিবেশনে আমরা পেয়েছি:

ডি:> প্রতিধ্বনি% তারিখ এবং সময়% ==> 20120208_123106

আমার ধারণা, export T=dateসিএমডি সেশনে কীভাবে কিছু করা যায় তা আমাদের খুঁজে বের করতে হবে।


1

আপনি যদি চান যে আপনার ব্যাচ ফাইলটি পরিবেশের ভেরিয়েবলগুলি অ্যাক্সেস করতে পারে যা সেই ব্যাচ ফাইলটি থেকে চালিত পাওয়ারশেল কমান্ড দ্বারা সেট করা হয়, আপনি নীচের কাজটি ব্যবহার করতে পারেন:

আপনার পাওয়ারশেল স্ক্রিপ্টকে একটি সাব ব্যাচ ফাইল তৈরি করুন, mysub.batএতে "সেট ভেরিয়েবল = মান" লাইন রয়েছে এবং পাওয়ারশেল কমান্ডের ঠিক পরে মাইচ ব্যাচ ফাইল থেকে সেই mysub.bat ব্যাচ ফাইলটি কার্যকর করুন।

ডিফল্ট পাওয়ারশেল আউটপুট পদ্ধতির পরিবর্তে WritAllLines পদ্ধতিটি ব্যবহার করুন যাতে উপ ব্যাচ ফাইলটি ইউটিএফ -8 এনকোডিং বিন্যাসের সাথে তৈরি না হয়।

উদাহরণ

main.bat:

REM main.bat first line
powershell -Command "[System.IO.File]::WriteAllLines(\".\mysub.bat\", \"set VARIABLE=VALUE\");"
.\mysub.bat
echo VARIABLE=%VARIABLE%
REM expected output: VARIABLE=VALUE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.