Powershell突然打开cmd.exe来执行bats

时间:2011-11-18 11:14:42

标签: powershell

直到昨天我使用

在powershell中执行脚本
"foo.bat"

"cmd /c commandhere"

它将在Powershell中运行命令并打印输出。现在从今天起它再也找不到“cmd”了,当使用“cmd.exe”或执行bat脚本时,它将打开cmd窗口,而不是在powershell中运行脚本。

有人知道这是可配置的还是我如何才能回到PowerShell内部执行脚本?

编辑:我的环境是:

PS C:\> echo $env:Path
C:\Windows\system32;C:\Windows\;C:\Windows\System32\Wbem;C:\Windows\system32\WindowsPowerShell\v1.0\;C:\xampp\php;C:\code\azure\bin;%SystemRoot%\system32\WindowsPowerShell\v1.0\;C:\Windows\System32

3 个答案:

答案 0 :(得分:0)

使用invoke-expression

http://technet.microsoft.com/en-us/library/dd347550.aspx

我认为它应该是这样的

invoke-expression -command "c:\batfile.bat"

或者更好地获得实际结果

$results = invoke-expression -command "c:\batfile.bat"

答案 1 :(得分:0)

PATHEXT环境变量决定哪些文件被视为“可执行”,因此在控制台输出中显示为内联。打印$env:pathext的值,并确保包含.BAT。

如果未列出.BAT,您可以使用Powershell中的以下命令将其重新添加:

$pathext = [Environment]::GetEnvironmentVariable("PATHEXT", "Machine")
[Environment]::SetEnvironmentVariable("PATHEXT", $pathext+';.BAT', "Machine")

这应该会导致.bat文件在Powershell控制台中以内联方式显示输出。要使它生效,您必须重新启动Powershell,或者将.BAT添加到Powershell进程自己的PATHEXT变量副本中:

$env:pathext = "$env:pathext;.BAT"

答案 2 :(得分:0)

要添加Justin的答案,“机器”可能不是您在这里寻找的目标,尽管代码snipet确实有效。

首先,如果PATHEXT不再包含“.BAT”或“.CMD”,则问题出在其他地方。

如果这是您环境中的正确行为,请继续阅读。

$pathext = [Environment]::GetEnvironmentVariable("PATHEXT", "Process")
[Environment]::SetEnvironmentVariable("PATHEXT", $pathext+';.BAT', "Process")
  • “Machine”目标将变量放在“HKEY_LOCAL_MACHINE”中 注册表,准备以供下一个阅读过程
  • “用户”目标将变量放在“HKEY_CURRENT_USER”注册表中,准备以便下一个进程读取
  • “Process”目标将当前正在运行的PowerShell.exe进程的变量置于可用状态

当我说“进程”时,我的意思是通过除脚本以外的其他方式启动的其他可执行文件。您的脚本启动的进程(作为您的bat / cmd命令)是子进程并继承当前环境,因此继承了所有已定义的变量,除非您指定它,否则就像第二个线程“start-process”。

对于我能读到的内容,这就是你想要实现的目标。 PATHEXT变量及其新添加的内容将仅通过PowerShell脚本/进程生效,并且可用于bat / cmd脚本。