新しいcmd.exeを起動し、環境を継承しないでください。

既存のシェルから新しいCMDシェルを開始すると、新しいシェルは既存の環境を継承します。新しいシェルを起動する方法はありますか?それはシステムのデフォルトに初期化され、継承されませんか?

現在の結果:

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

[update] Solution for this is start /i cmd, as shared by dbenham, below. However it doesn't help in the situation where the current shell is already second generation. Example:

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!
24
この質問を閉じる投票があります、なぜ私は不思議です。何が面白い/価値があるのですか?
追加された 著者 matt wilkie,
あなたの質問を閉じる投票をしたユーザーは、ここで話題にはならず、 superuser.com に属していることを示唆しているだけです。
追加された 著者 Andriy M,
はい、それは私でした、私はそれがスーパーユーザーのほうが良いと思っていました。明らかに私はoutvotedされている! :)
追加された 著者 Cam Jackson,

5 答え

Andersのレシピでは、新しい環境を詳細に制御できます。その深さ制御のために、受け入れられた答えとして残しています。しかし、その答えの1つのフレーズは、私がこの質問を促した特定の問題に対して実際に使用する方法を私にもたらしました。 "初期のexplorer.exe環境と同等の環境" です。ああ!私はそのする方法を知っています!

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

注:これはもともとは単純に start/i explorer ... でしたが、確実に動作しないことが判明し、両方のパーツに完全パスを使用する必要があります。必要なのが解決策であれば、今はすべてがあり、残りを無視することができます。


下のAnderのコメントに続いて、私は4台のWin7コンピュータ、つまりPro、Home、Enterprise、32および64bitでテストしました。私は、ユーザーアカウント制御を、すべての方法で、すべての方法を最期にしていた。また、管理者以外のコマンドプロンプトシェルでもテストされています。これらはすべてエラーや警告なしで機能しました。

ローカル管理者としてログオンしたServer 2003では、ファイルのダウンロード - セキュリティ警告:このファイルを実行または保存しますか?のポップアップダイアログが表示されます。 [実行]を押すと、追加のダイアログボックスが表示され、 "Windowsエクスプローラ - セキュリティ警告:パブリッシャを確認できませんでした。このソフトウェアを実行してもよろしいですか?" [run]をもう一度押すと、最終的に使用可能なコマンドシェルが生成されます。どうやら、exeへのフルパスなしでWindowsエクスプローラの代わりにInternet Explorerが使用されるという奇妙なロジックがあります。

しかし、タイトルで start を使用すると(には常に 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"
12
追加された
このソリューションでは本当に/I オプションが必要ですか?私はexplorer.exeがいずれかの方法でデフォルト値を開始すると思います。
追加された 著者 dbenham,
これはエクスプローラの構文AFAIKには対応していません。試してみるとセキュリティに関する警告が出ます。
追加された 著者 Anders,

PowerShellを使用したい場合は、以下を使用できます。

Start-Process -UseNewEnvironment powershell

または

Start-Process -UseNewEnvironment cmd

4
追加された

私は同じ窓でそれをする方法を知らない。しかし、あなたは別のウィンドウでタスクを達成することができます

start /i cmd

新しいセッションが終了するまであなたの現在のcmdセッションを待たせたい場合は、/wait オプションを追加することができます

編集

私はRomárioのコメントのおかげで修正されました。 /Bと/ WAIT オプションを追加すると、同じウィンドウに新しいcmd.exeセッションを作成できます。

start /i /b /wait cmd

新しいcmd.exeは、親が起動されたときに存在していた初期環境を継承することに注意してください。親が別のcmd.exe環境から起動された場合、デフォルト環境ではない可能性があります。

3
追加された
/b スイッチを使用して同じウィンドウに配置できます。
追加された 著者 Romário,
start/i cmd は親cmdウィンドウの元の%path%をまだ保持していますか?それはquesitonが望んでいたものではありません。
追加された 著者 Pacerier,
大丈夫です、それは私のための部分的な解決策です、新しい窓は取引の中断者ではありません。私の初期の質問には十分な情報が含まれていないことが明らかになりました。私の親シェルはシステムのデフォルトではなく、 start/i cmd シェルで継承される設定を持っています。私はそれに応じてQを更新します。
追加された 著者 matt wilkie,
@Romário - もちろん!なぜ私は/I /B オプションを組み合わせるとは思わなかったのか分かりません。しかし、おそらく/WAIT オプションも必要です。そうしないと、共有コンソールは非常に混乱します。
追加された 著者 dbenham,
@Pacerier - PATH変数は他の変数と変わりません。新しいcmdセッションは親セッションの現在の環境を無視し、代わりに親セッションが開始されたときに存在していた値を使用します。親セッションがデフォルト値で開始されていない可能性があるため、これはOPが探していたものと正確に一致していないことをすでに認めています。しかし、この答えは正しい方向への一歩であり、多くの状況で適切です。
追加された 著者 dbenham,

変数のいくつかはログオン時に初期化され、他のレジストリエントリには格納されません。したがって、初期の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の出力はすべてのWindowsバージョンで同じではないため、ターゲットシステムで動作することを確認する必要があります(変数の名前にスペースが含まれていると問題が発生します。 "" tokens = 2、* delims = ""(delimsはタブと同じです)の "tokens = 2、*" タブをセパレータとして使用)

これらの問題を回避するには、バッチファイルではなくWindowsスクリプトホストスクリプトを使用します。

'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メソッドを使用して、多くのホワイトリスト項目を削除することができます...

3
追加された
なぜ単に start/i%windir%/ explorer "%windir%\ system32 \ cmd.exe" を実行しないのですか?
追加された 著者 Pacerier,
@Pacerier正常に動作しているように見えますが、技術的に有効なExplorer構文ではありません。セキュリティ警告を回避する方法については、下記の回答を参照してください。
追加された 著者 Anders,

これは古い投稿のように見えますが、これは私が試したものです:

スタート/ i

this link has more info: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/start.mspx?mfr=true

そのコマンドは、スタートアップcmd環境のような新しいウィンドウを開くはずです。

1
追加された
start/i だけでは動作しません。 start/i%windir%/ explorer "%windir%\ system32 \ cmd.exe"が必要です。
追加された 著者 Pacerier,
dbenhamまたはmatt wilkieと同じソリューションです
追加された 著者 jeb,