Windows 8 cmd 可能会有变化吗?

Windows 8 cmd 可能会有变化吗?

出于某种原因,我决定在我的开发机器上试用 Windows 8。到目前为止,一切顺利,直到我尝试启动具有一些自定义功能的 Powershell,包括PATH从中提取更改vcvars32.bat,这样我就可以访问所有各种开发工具。

最初,脚本是从这里提取的https://stackoverflow.com/questions/138144/whats-in-your-powershell-profile-ps1file进行了一些更改以允许它在 x64 Powershell 实例中运行,因此最终看起来像这样:

function Get-Batchfile($file) 
{
    $theCmd = "`"$file`" & set" 
    cmd /c $theCmd | Foreach-Object {
        $thePath, $theValue = $_.split('=')
        Set-Item -path env:$thePath -value $theValue
    }
}

function VsVars32($version = "10.0")
{
    $theKey = "HKLM:SOFTWARE\Wow6432Node\Microsoft\VisualStudio\" + $version
    $theVsKey = get-ItemProperty $theKey
    $theVsInstallPath = [System.IO.Path]::GetDirectoryName($theVsKey.InstallDir)
    $theVsToolsDir = [System.IO.Path]::GetDirectoryName($theVsInstallPath)
    $theVsToolsDir = [System.IO.Path]::Combine($theVsToolsDir, "Tools")
    $theBatchFile = [System.IO.Path]::Combine($theVsToolsDir, "vsvars32.bat")
    write-host $theBatchFile
    Get-Batchfile $theBatchFile
    [System.Console]::Title = "Visual Studio " + $version + " Windows Powershell"
}

VsVars32

它在 Windows 7 下运行得很好。现在,在 Windows 8 下,我得到了以下结果:

'C:\Program' is not recognized as an internal or external command, operable program or batch file.

经过进一步检查,似乎cmd /c工作方式发生了一些变化。仅运行该cmd行,结果如下:

PS> cmd /c "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"
'C:\Program' is not recognized as an internal or external command, operable program or batch file.

有没有人遇到过类似的问题并希望找到解决方法?

编辑:

正如下面的回答中提到的,可能存在引用问题。我在发布之前就尝试过这个,结果得到了这个:

PS> cmd /c ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat""
x86 : The term 'x86' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:28
+ cmd /c ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvar ...
+                            ~~~
    + CategoryInfo          : ObjectNotFound: (x86:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

引用的几种不同排列:

用单引号括起来:

PS> echo '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"'
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"

PS> cmd /c '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"'
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.

转义双引号:

PS> echo "`"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat`""
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"

PS> cmd /c "`"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat`""
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.

再一次:完全相同的脚本在 Windows 7 下运行。

答案1

如果您使用 Windows Power Shell,并且路径中有空格,则必须使用“”(双引号)。

""C:\Program Files""

示例:cmd /c ""start cd 'C:\Program Files'""打开一个新命令提示符,当前目录为C:\Program Files。如果不用双引号括起来,则会因括起来的空格“ ”而引发错误。

编辑:它也适用于双单引号。

编辑:您可以选择使用 ` 字符(反引号/反勾号)来转义空格。

cmd /c start cd C:\Program` Files

答案2

通过阅读这个问题:https://stackoverflow.com/questions/6471320/how-to-call-cmd-exe-from-powershell-with-a-space-in-the-specified-commands-dire在 stack overflow 上,cmd 看起来应该是这样的形式

cmd.exe /c "`"$_cmd`""

注意末尾的两个双引号,只有一个。


在该行中:

cmd /c "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"

也许它将引号中的参数视为C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat没有引号的字符串,所以也许应该是

cmd /c """C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"""

"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"作为字符串,即上面那样。

答案3

我正要用更多信息更新这个问题,让它回应将在 Win7 和 Win8 上运行的命令。在此过程中,我注意到了一些事情。我的 Windows 7 PC 同时安装了 VS2010 和 VS2012,而 Win8 机箱只安装了 VS2012。

更改$VersionVsVars32 函数中的默认值可使11.0一切恢复正常。现在,至于为什么不打印出完整路径(这会使此问题更容易排除故障),这是一个非常好的问题。

相关内容