Можливі зміни Windows 8 cmd?


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.


Я думаю, що існує пробільна проблема "C: \ progrma files (x86) \" чи ні?
avirk

Можливо, вам потрібно уникнути дужок? Схоже, він ставиться до них як до змінної.
Джордж Дюкетт

Invoke-CmdScript.ps1 робить щось подібне, але здається трохи чистішим. Можливо, спробуйте: poshcode.org/2176
Jay Bazuzi

Відповіді:


1

Якщо ви використовуєте Windows Power Shell, вам доведеться використовувати "" (подвійні подвійні лапки), якщо у вас є пробіли.

""C:\Program Files""

Приклад: cmd /c ""start cd 'C:\Program Files'""відкриває новий командний рядок з поточним каталогом як C:\Program Files. Якщо його не укладено у подвійні лапки, це призведе до помилки через укладений пробіл ''.

Редагувати: також працює з подвійними одноцитатами.

Редагувати: необов'язково, ви можете залишити пробіл за допомогою символу `(зворотній цитат / зворотний галочок).

cmd /c start cd C:\Program` Files

Справа в тому, що я просто запускав це самостійно як тест. Командний рядок, що передається в, cmd /cвбудовується в змінну, і вона робить втечі цитати там. Крім того, як було сказано, цей самий сценарій чудово працював під Win7.
Метт Сікер

Так, я розумію .. Чи можна укласти подвійний лапок командного рядка? щоб він сподівався повторно закрити при передачі?
agirish

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"як рядок, що було б вище.


Не впевнений, чому він би працював у 7, але не в 8, якщо це так. Якщо ні, я видалю.
Джордж Дакетт

Те саме мене трохи кинуло, коли я вперше подивився на фрагмент. Це насправді працює vsvars, а потім запускається встановити відразу після з &, тому вся команда, яка передається, - "[шлях до vsvars.bat] & set", а потім аналізує те, що виходить із безлічі.
Метт Сікер

Дивіться редагування для іншого переходу
Джордж Дакетт


0

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.