5

По какой-то причине я решил попробовать Windows 8 на моей машине для разработки. Пока все хорошо, пока я не попытаюсь запустить Powershell, в котором есть некоторые настройки, включая извлечение изменений PATH из vcvars32.bat , так что у меня есть доступ ко всем различным инструментам разработки.

Изначально скрипт был извлечен отсюда https://stackoverflow.com/questions/138144/whats-in-your-powershell-profile-ps1file с некоторыми изменениями, чтобы он мог работать в экземпляре Powershell x64, поэтому он в итоге выглядел как это:

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.

3 ответа3

1

Если вы используете Windows Power Shell, вы должны использовать "" (двойные двойные кавычки), если у вас есть пробелы в вашем пути.

""C:\Program Files""

Пример: cmd /c ""start cd 'C:\Program Files'"" открывает новую командную строку с текущим каталогом C:\Program Files . Если его не заключить в двойные кавычки, он выдаст ошибку из-за закрытого пробела ''.

Изменить: Он работает с двойными одинарными кавычками, а также.

Редактировать: При желании вы можете выйти из пробела, используя символ `(обратная кавычка / обратная галочка).

cmd /c start cd C:\Program` Files
0

Я как раз собирался обновить вопрос, добавив больше информации, повторяя команду, которую он собирался запустить на Win7 и Win8. В процессе этого я кое-что заметил. На моем ПК с Windows 7 были установлены как VS2010, так и VS2012, а на коробке Win8 только VS2012.

Изменение значения $Version умолчанию в функции VsVars32 на 11.0 заставило все снова работать. Теперь, что касается того, почему он не распечатывал полный путь, который сделал бы эту проблему намного легче устранить, это очень хороший вопрос.

0

Прочитав этот вопрос: https://stackoverflow.com/questions/6471320/how-to-call-cmd-exe-from-powershell-with-a-space-in-the-specified-commands-dire переполняет его стек похоже, что 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" в виде строки, которая будет описана выше.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .