2011-11-24 13 views
23

यदि मैं मौजूदा शेल से एक नया सीएमडी खोल शुरू करता हूं, तो नया खोल मौजूदा वातावरण को विरासत में लेता है। क्या कोई नया खोल शुरू करने का कोई तरीका है लेकिन क्या इसे सिस्टम डिफॉल्ट में प्रारंभ किया गया है और वारिस नहीं है?नया cmd.exe प्रारंभ करें और पर्यावरण का वारिस न करें?

वर्तमान परिणाम:

B:\>set _test=blooharky 

B:\>cmd 
Microsoft Windows [Version 6.1.7600] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

B:\>set _ 
_test=blooharky 

वांछित परिणाम:

B:\>set _test=blooharky 

B:\>cmd /env=default 
Microsoft Windows [Version 6.1.7600] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

B:\>set _ 
Environment variable _ not defined 

[अद्यतन] इस के लिए समाधान start /i cmd रूप dbenham, below द्वारा साझा है। हालांकि यह उस स्थिति में मदद नहीं करता है जहां वर्तमान खोल पहले से ही दूसरी पीढ़ी है। उदाहरण:

d:\>set _ 
Environment variable _ not defined 

d:\>set _test=blooharky 

d:\>cmd /k 

:: some work done using _test here... 
:: ...but after we need a new clean shell: 

d:\>start /i cmd 

d:\>set _ 
_test=blooharky 

:: uhoh, our shell isn't clean! 
+0

एक वोट है इस सवाल के बंद करने के लिए, मैं उत्सुक क्यों कर रहा हूँ। इसके बारे में क्या अनिच्छुक/योग्य है? –

+2

जिस उपयोगकर्ता ने आपके प्रश्न को बंद करने के लिए मतदान किया है वह केवल यह सुझाव दे रहा है कि यह यहां विषय-वस्तु है और http://superuser.com/ –

+0

पर है हाँ, यह मैं था, मैंने सोचा कि यह सुपरसियर में बेहतर होगा। स्पष्ट रूप से मुझे बाहर निकाल दिया गया है! :) –

उत्तर

2

लॉगऑन पर कुछ चर प्रारंभ किए गए हैं और अन्य रजिस्ट्री प्रविष्टियों के साथ संग्रहीत नहीं हैं, इसलिए यदि आप ऐसे माहौल चाहते हैं जो प्रारंभिक explorer.exe वातावरण के बराबर है, तो आपको उन वस्तुओं को श्वेत-सूची करने की आवश्यकता है और उम्मीद है कि उनके पास नहीं है किसी के द्वारा बदल दिया गया:

@echo off 
setlocal ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION 
goto main 

:SetFromReg 
FOR /F "tokens=2,*" %%A IN ('REG query "%~1" /v "%~2"^|find /I "REG_"') DO (
    call set %~3=%%B 
) 
goto :EOF 

:GetRegEnv 
FOR /F %%A IN ('REG query "%~1" /s^|find /I "REG_"') DO (
    if /I not "%%~A"=="Path" call :SetFromReg "%~1" "%%~A" "%%~A" 
) 
goto :EOF 

:InheritOrDelete 
for %%A in (save_TEMP Path SystemRoot SystemDrive ProgramFiles CommonProgramFiles ALLUSERSPROFILE COMPUTERNAME LOGONSERVER USERNAME USERDOMAIN HOMEDRIVE HOMEPATH USERPROFILE APPDATA) do if /I "%%~A"=="%~1" goto :EOF 
set %~1= 
goto :EOF 

:main 
REM Save temp 
set save_TEMP=%temp% 
if not defined save_TEMP set save_TEMP=%tmp% 

for /F "delims==" %%A in ('set') do call :InheritOrDelete "%%~A" 
call :GetRegEnv "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 
call :GetRegEnv "HKCU\Environment" 

REM Special handling for Path 
call :SetFromReg "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" Path Path 
setlocal 
set u= 
call :SetFromReg "HKCU\Environment" Path u 
endlocal&if not "%Path%"=="" if not "%u%"=="" set Path=%Path%;%u% 

REM Restore TEMP/TMP 
set TEMP=%save_TEMP% 
set save_TEMP= 
set TMP=%TEMP% 

REM start some command... 
start cmd /d /k set 

Reg.exe से उत्पादन हर विंडोज़ संस्करण पर ही तो आप यकीन है कि यह अपने लक्ष्य सिस्टम पर काम करता है बनाने के लिए होता है (यह भी अगर के नाम समस्याओं होगा नहीं है एक चर में एक स्थान होता है, आप इसे "tokens=2,*""tokens=2,* delims= " (डेलीम्स टैब के बराबर) के साथ बदलकर ठीक कर सकते हैं, लेकिन इससे पहले कि आप यह सुनिश्चित कर लें कि reg.exe आउटपुट हमेशा विभाजक के रूप में टैब का उपयोग करता है)

आप इन मुद्दों के चारों ओर एक बैच फ़ाइल के बजाय एक खिड़कियों पटकथा मेजबान स्क्रिप्ट का उपयोग कर काम कर सकते हैं:

'orgenvshell.vbs: 
Set WShl = CreateObject("WScript.Shell") 
Set FSO = CreateObject("Scripting.FileSystemObject") 

Function CanInherit(n) 
    CanInherit = False 
    w = Split("SystemRoot SystemDrive ProgramFiles CommonProgramFiles ALLUSERSPROFILE COMPUTERNAME LOGONSERVER USERNAME USERDOMAIN HOMEDRIVE HOMEPATH USERPROFILE APPDATA") 
    For Each i In w 
     If 0 = StrComp(i,n,1) Then 
      CanInherit = True 
      Exit Function 
     End If 
    Next 
End Function 

Function GetShortFolderPath(p) 
    GetShortFolderPath = p 
    On Error Resume Next 
    GetShortFolderPath = FSO.GetFolder(p).ShortPath 
End Function 

Sub E(dst,src) 
    set envs = WShl.Environment(src) 
    For Each i In envs 
     t = Split(i,"=") 
     n = t(0) 
     If n = "" Then n = "="&t(1) 
     If IsNull(dst) Then 
      If not CanInherit(n) Then envs.Remove n 
     Else 
      v = Mid(i,Len(n)+2) 
      envd = dst 
      If "X" = dst Then 
       v = WShl.ExpandEnvironmentStrings(v) 
       envd = src 
       If 0 = StrComp(n,"TMP",1) Then v = GetShortFolderPath(v) 
       If 0 = StrComp(n,"TEMP",1) Then v = GetShortFolderPath(v) 
      End If 
      WShl.Environment(envd)(n) = v 
     End If 
    Next 
End Sub 

E Null,"PROCESS" 
E "PROCESS","SYSTEM" 
E "PROCESS","USER" 
E "X","PROCESS" 

'Special hack for Path 
s = WShl.Environment("SYSTEM")("Path") 
u = WShl.Environment("USER")("Path") 
If Len(u) Then s = s&";"&u 
WShl.Environment("PROCESS")("Path") = WShl.ExpandEnvironmentStrings(s) 

'Test a command 
WShl.Run "cmd /d /k set ",1 

आप शायद WMI क्वेरी करने और अन्य WSH तरीकों का उपयोग करके सफेद सूचीबद्ध आइटम का एक बहुत निकाल सकते ...

+1

क्यों न केवल 'प्रारंभ/i% windir%/explorer "% windir% \ system32 \ cmd.exe" '? – Pacerier

+0

@Pacerier यह तकनीकी रूप से मान्य एक्सप्लोरर सिंटैक्स नहीं है, भले ही यह काम करता है। सुरक्षा चेतावनी के आसपास काम करने के तरीके के लिए नीचे दिए गए उत्तर को देखें। – Anders

3

मुझे एक ही विंडो में ऐसा करने के तरीके से अवगत नहीं है। लेकिन तुम

start /i cmd 

का उपयोग कर एक अलग विंडो में कार्य को पूरा कर सकते हैं जब तक नया सत्र आप

संपादित

मैं /wait विकल्प जोड़ सकते हैं समाप्त होता है अपने वर्तमान cmd सत्र तक इंतजार करना चाहते हैं रोमानियो की टिप्पणी के लिए धन्यवाद, सही खड़े हो जाओ। आप उसी विंडो में नया cmd.exe सत्र बनाने के लिए /B and /WAIT विकल्प जोड़ सकते हैं।

start /i /b /wait cmd 

ध्यान दें कि नया cmd.exe प्रारंभिक वातावरण प्राप्त करता है जो माता-पिता लॉन्च होने पर अस्तित्व में था। यह मूल वातावरण नहीं हो सकता है यदि माता-पिता स्वयं को cmd.exe वातावरण से लॉन्च किया गया हो।

+0

ठीक है, यह मेरे लिए आंशिक समाधान है, एक नई खिड़की एक सौदा ब्रेकर नहीं है। यह बताता है कि मेरे शुरुआती प्रश्न में पर्याप्त जानकारी नहीं थी। मुझे एक क्लीन * सिस्टम डिफॉल्ट * वातावरण शुरू करने की ज़रूरत है, मेरा पैरेंट शैल सिस्टम डिफॉल्ट नहीं है और इसमें सेटिंग्स 'प्रारंभ/i cmd' खोल में विरासत में हैं जो नहीं होना चाहिए। मैं तदनुसार क्यू अपडेट करूंगा। –

+0

आप इसे '/ b' स्विच का उपयोग करके उसी विंडो में रख सकते हैं। –

+0

@ रोमरियो - बेशक! मुझे नहीं पता कि मैंने '/ I' और'/B' विकल्पों को गठबंधन क्यों नहीं किया। लेकिन आप शायद '/ WAIT' विकल्प भी चाहते हैं, अन्यथा साझा कंसोल बहुत भ्रमित हो जाता है। – dbenham

10

एंडर्स की नुस्खा के पास एक नए वातावरण पर विस्तृत नियंत्रण है, और मैं उस गहराई नियंत्रण के कारण स्वीकृत उत्तर के रूप में इसे छोड़ रहा हूं। हालांकि उस जवाब में एक वाक्यांश ने मुझे उस विधि का नेतृत्व किया जिसकी मैं वास्तव में उस विशेष समस्या के लिए उपयोग कर रहा हूं जिसने इस जांच को प्रेरित किया। एक "पर्यावरण जो प्रारंभिक explorer.exe पर्यावरण के बराबर है"। ओह! मुझे पता है कि कैसे करें!

start /i "%windir%\explorer.exe" "%windir%\system32\cmd.exe" 

नोट: मूल रूप से इस बस start /i explorer ... था, लेकिन यह पता चला है कि मज़बूती से काम नहीं करता है, और एक पूर्ण पथ दोनों भागों के लिए इस्तेमाल किया जा किया जाना चाहिए। यदि आपको केवल एक समाधान की आवश्यकता है, तो आपके पास अब सबकुछ है और बाकी को अनदेखा कर सकता है।


नीचे Ander की टिप्पणी के बाद सुरक्षा चेतावनी मैं 4 Win7 कंप्यूटर, प्रो, गृह मिश्रण और एंटरप्राइज़, 32 और 64 बिट पर परीक्षण के बारे में। मैं उपयोगकर्ता खाता नियंत्रण के साथ, सभी तरह से और सभी तरह से नीचे झुका हुआ। एक गैर-प्रशासक कमांड प्रॉम्प्ट खोल के साथ भी परीक्षण किया गया। ये सभी त्रुटि या चेतावनी के बिना काम किया।

सर्वर 2003 पर, स्थानीय व्यवस्थापक के रूप में लॉग ऑन किया गया, मुझे एक पॉपअप संवाद "फ़ाइल डाउनलोड - सुरक्षा चेतावनी: क्या आप इस फ़ाइल को चलाने या सहेजना चाहते हैं?" रन, सेव, और रद्द करने के लिए बटन के साथ। एक अतिरिक्त संवाद में [रन] परिणाम दबाकर, "विंडोज एक्सप्लोरर - सुरक्षा चेतावनी: प्रकाशक सत्यापित नहीं किया जा सका। क्या आप वाकई इस सॉफ्टवेयर को चलाने के लिए चाहते हैं?"। [रन] को फिर से दबाकर आखिरकार एक प्रयोग योग्य कमांड खोल में परिणाम मिलता है। स्पष्ट रूप से कुछ अजीब तर्क हैं जिसके परिणामस्वरूप इंटरनेट एक्सप्लोरर को एक्सप्लोरर के पूर्ण पथ के बिना विंडोज एक्सप्लोरर के लिए प्रतिस्थापित किया जा रहा है।

यह अजनबी भी हो जाता है: शीर्षक के साथ start का उपयोग करके, (कुछ always include a title की सलाह देते हैं) परिणाम पूर्ण पथ के बावजूद सुरक्षा चेतावनियों में होते हैं। निर्देशिका शुरू करने जैसे अन्य पैरामीटर ठीक लगते हैं।

:: security warning 
start "clean shell" /i "%windir%\explorer.exe" "%windir%\system32\cmd.exe" 

:: is okay 
start /i /d x:\ "%windir%\explorer.exe" "%windir%\system32\cmd.exe" 
+1

यह एक्सप्लोरर सिंटैक्स AFAIK समर्थित नहीं है और जब मैंने कोशिश की तो मुझे सुरक्षा चेतावनी मिली। – Anders

+0

क्या इस समाधान के साथ '/ I' विकल्प वास्तव में आवश्यक है? मुझे लगता है कि explorer.exe डिफ़ॉल्ट मानों को किसी भी तरह से शुरू करेगा। – dbenham

-1

यह एक पुरानी पोस्ट की तरह दिखता है, लेकिन यह है कि मैं क्या करने की कोशिश की है: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/start.mspx?mfr=true

आदेश एक नया खोल देना चाहिए:

आरंभ/मैं

इस लिंक और अधिक जानकारी है खिड़की जो स्टार्टअप cmd पर्यावरण की तरह है।

+0

यह वही समाधान है जैसे डबेनहम या मैट विल्की – jeb

+0

'प्रारंभ/i' स्वयं काम नहीं करता है, है ना? आपको 'start/i% windir%/explorer "% windir% \ system32 \ cmd.exe" 'की आवश्यकता है – Pacerier

3

आप powershell उपयोग करने के लिए तैयार हैं, तो आप उपयोग कर सकते हैं:

Start-Process -UseNewEnvironment powershell

या

Start-Process -UseNewEnvironment cmd

संबंधित मुद्दे