विंडोज कमांड प्रॉम्प्ट: मैं एक कमांड के आउटपुट को पर्यावरण चर में कैसे प्राप्त करूं?


59

मैं एक पर्यावरण चर है जो cmd.exe में सप्ताह का दिन सम्‍मिलित करना चाहता हूं।

जब मैं यह कमांड चलाता हूं तो मुझे वह परिणाम मिलता है जो मैं चाहता हूं।

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

मेरा लक्ष्य कुछ बैकअप स्क्रिप्ट के लिए बैच फ़ाइल में चर का उपयोग करना है।

जवाबों:


87

आप कुछ का उपयोग कर सकते हैं जैसे:

$env:DOW = "foo"

3
मुझे समझ में नहीं आता है कि यह नकारात्मक रूप से क्यों ध्वजांकित किया गया था, क्या आप पर्यावरण चर सेट करने के लिए बेहतर जानते हैं?
आयन टोडरेल

2
+1 यह मेरे लिए उस परिदृश्य में बहुत अच्छा काम करता है, जिसकी मुझे ज़रूरत थी। PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
डेविड रुहमन

14
@IonTodirel क्योंकि यह केवल प्रोसेस स्पेस में बना रहता है।
जॉनड

अंत में अब मुझे समझ में आया कि कैसे
RIDS_ENV को पावरशेल

और फिर आप इसे कैसे काम करते हैं यह सुनिश्चित करने के लिए आउटपुट करते हैं?
कॉडीबगस्टीन

22

आपको PowerShell में दोनों कमांड चलाने चाहिए क्योंकि PowerShell पर्यावरण चर को हेरफेर करने में सक्षम से अधिक है।

अर्थात:

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

या

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

वैसे, आपकी स्क्रिप्ट काम नहीं करती है क्योंकि आपको जो भी मिल रहा है वह PowerShell रिटर्न कोड है, न कि वह जो डेटा पैदा करता है। इसे काम करने का एक तरीका हो सकता है, लेकिन यह केवल एक उचित PowerShell स्क्रिप्ट का उपयोग करने की तुलना में व्यर्थ है।

पूर्णता के लिए, यहां Microsoft से PowerShell और पर्यावरण चर पर एक अच्छा लेख है:

पर्यावरण चर बनाने और संशोधित करना

अपडेट: चैट में @ syneticon-dj के साथ इस समाधान की समीक्षा करने के बाद, यह इस पद्धति का उपयोग करके आपके द्वारा सामना की जाने वाली समस्या प्रकट होती है, इससे पहले कि यह बाहरी रूप से हुई पर्यावरणीय चर में परिवर्तन को प्रतिबिंबित करेगा एक कमांड प्रॉम्प्ट को फिर से लोड करना होगा।

आपने इसके बारे में अधिक विवरण नहीं दिया है कि आप क्या कर रहे हैं, लेकिन अगर यह एकमात्र कारण है जो आप PowerShell लॉन्च कर रहे हैं, तो मेरे वास्तविक सुझाव की तुलना में कि आप कैसे काम कर रहे हैं, इसकी समीक्षा करेंगे।

या तो आपकी पूरी प्रक्रिया PowerShell का उपयोग कर रही है या क्या आपने इसके बजाय निर्धारित कार्यों का उपयोग करने पर विचार किया है? आप सप्ताह के दिन के आधार पर कार्यों को निर्धारित कर सकते हैं।


बैच फ़ाइल को हर दिन चलाया जाएगा और निर्धारित कार्यों से चलाया जाएगा। इसके बजाय में शक्तियों में काम करने की सोच रहा हूँ। लेकिन सीएमडी की तुलना में अधिक नौसिखियों में im। और अभी मैं एक साधारण आदेश के साथ कठिनाइयों कर रहा हूँ। लेकिन मैं उस एक के बारे में एक नया सवाल कर सकता हूं, शायद यह आपके लिए एक आसान है :) EDIT: मैंने इसे समझ लिया है। यह था कि कुछ मापदंडों के साथ एक कार्यक्रम कैसे चलाया जाए।
टिम

मैं पॉवरशेल में महान नहीं हूं, या तो, लेकिन यह सीखने लायक है। एक शुरुआत के लिए यह लगभग हर तरह से बेहतर है, लेकिन यह उस तरह से भी है जैसे Microsoft (और अन्य निर्माता) आगे बढ़ रहे हैं।
डैन

1
यह भी ध्यान दें कि @ दान का सुझाव पर्यावरण चर को स्थायी रूप से (या तो मशीन या उपयोगकर्ता संदर्भ में) सेट करता है। यदि आप तीसरे पैरामीटर को छोड़ देते हैं, तो आप इसे केवल वर्तमान प्रक्रिया के लिए सेट कर सकते हैं, जो कभी-कभी अधिक वांछनीय होता है।
प्रति लंडबर्ग

20

मेरा मानना ​​है कि [Environment]::SetEnvironmentVariableडैन द्वारा सुझाए गए अनुसार PowerShell के भीतर से पर्यावरण वैरिएबल को सेट करना व्यर्थ है, क्योंकि आप 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अपने PowerShell कमांड के आउटपुट को पार्स करने के लिए कमांड के रूप में उपयोग कर सकते हैं और इसे एक चर में डाल सकते हैं:

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

ध्यान रखें कि ^आपके PowerShell कॉल के भीतर कोष्ठक विशेष वर्णों से बचने के लिए उपयोग किए जाने वाले कैरेट वर्ण ।

यदि आप इसे कमांड लाइन से परीक्षण कर रहे हैं और बैच फ़ाइल संदर्भ में नहीं हैं, तो आपको %%पहले वाले चर संदर्भों को प्रतिस्थापित करना होगा %:

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")एक रनिंग पावरशेल सेशन के भीतर से सेटिंग करने की कोशिश की है, लेकिन पावरशेल की समाप्ति पर यह मेरे पैरेंट सीएमडी सेशन में मौजूद नहीं था
डब्बल

स्वरूपण ने इसे खराब कर दिया है, लेकिन आपने $ dow को परिभाषित नहीं किया है। पॉवर्सशेल स्क्रिप्ट में मेरे उदाहरण को चलाना सामान्य पर्यावरण चर को अपेक्षित रूप से संग्रहीत करता है।
डैन

1
@ डैन बीटीडब्ल्यू: मुझे नीचता पर ऐतराज नहीं है, लेकिन यह ध्यान दिया जाना चाहिए कि प्रदर्शित दृष्टिकोण स्पष्ट रूप से वही करता है जो प्रश्नकर्ता ने पूछा है , इसलिए यदि अधिक सुरुचिपूर्ण दृष्टिकोण था, तब भी यह समस्या का एक वैध समाधान होगा।
वाबेट

1
@ विंडोज में सामान्य व्यवहार जैसा लगता है। यहां तक ​​कि अगर आप वैश्विक पर्यावरण चर को अपडेट करते हैं, तो केवल प्रक्रियाएं शुरू हो जाती हैं क्योंकि अद्यतन परिवर्तन को पहचान लेगा। चूंकि आप मूल प्रक्रिया के बारे में बात कर रहे हैं , यह बदलाव से पहले शुरू हो गई होगी। SETकमांड प्रॉम्प्ट में भी यही बात होती है । एक बच्चा शुरू करने की कोशिश करें cmd.exeऔर आप एक ही चीज देखेंगे। हालाँकि , PowerShell में आप जो व्यवहार देख रहे हैं , वह इसलिए है क्योंकि .NET वर्ग के माध्यम से पर्यावरण चर को अद्यतन करना वर्तमान प्रक्रिया को प्रभावित नहीं करता है, हालांकि।
jpmc26

4

अगर यह मेरे थे, और मूल स्क्रिप्ट को एक शेल स्क्रिप्ट होना चाहिए, तो मैं .CMD स्क्रिप्ट में Powerhell की तरह एक चुटीला आह्वान करूंगा:

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

आपको अपनी पॉवरशेल निष्पादन नीति (सेट-एक्ज़ीक्यूशन पॉलीसील cmdlet) की जाँच करने की आवश्यकता हो सकती है।


3

या यदि आप पुराने शेल में ऐसा करने के लिए विवाहित हैं, तो PowerShell को पूरी तरह से छोड़ दें।

% दिनांक% चर का उपयोग करें और इसके द्वारा दिए गए संक्षिप्त नाम से दिन का विस्तार करें (यह क्षेत्रीय तिथि प्रारूप सेटिंग्स से प्रभावित हो सकता है):

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 को% DATE% में प्रदर्शित नहीं करेगा: H: \> echo% दिनांक% 20/03/2019
Raúl Salinas-Monteagudo

1

वास्तव में, जब एक .ps1 फ़ाइल (कहते हैं t.ps1) में नीचे की तरह कुछ डालते हैं और इसे पॉवरशेल के साथ एक सीएमडी सत्र से बुलाते हैं -File t.ps1... यह अच्छी तरह से काम करता है।

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

लेकिन सीएमडी सत्र के लिए नहीं जहां से t.ps1 स्क्रिप्ट को बुलाया गया है। एक नए सीएमडी सत्र में हम प्राप्त करते हैं:

D:> इको% DateAndTime% ==> 20120208_123106

मुझे लगता है कि हमें यह पता लगाना है कि export T=dateसीएमडी सत्र में कैसे कुछ किया जाए ।


1

यदि आप चाहते हैं कि आपकी बैच फ़ाइल, उस बैच फ़ाइल से चलाए जाने वाले PowerShell कमांड द्वारा सेट किए गए पर्यावरण चर तक पहुँचने के लिए, आप निम्न वर्कअराउंड का उपयोग कर सकते हैं:

अपनी PowerShell स्क्रिप्ट को एक सब बैच फ़ाइल बनाएं mysub.bat, जिसमें "सेट चर = मान" लाइनें हों, और PowerShell कमांड के ठीक बाद मुख्य बैच फ़ाइल से उस mysub.bat बैच फ़ाइल को निष्पादित करें।

डिफ़ॉल्ट PowerShell आउटपुट विधियों के बजाय WriteAllLines विधि का उपयोग करें ताकि उप बैच फ़ाइल UTF-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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.