直到昨天我使用
在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
答案 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")
当我说“进程”时,我的意思是通过除脚本以外的其他方式启动的其他可执行文件。您的脚本启动的进程(作为您的bat / cmd命令)是子进程并继承当前环境,因此继承了所有已定义的变量,除非您指定它,否则就像第二个线程“start-process”。
对于我能读到的内容,这就是你想要实现的目标。 PATHEXT变量及其新添加的内容将仅通过PowerShell脚本/进程生效,并且可用于bat / cmd脚本。