Как мне написать это в скрипте Powershell? - PullRequest
4 голосов
/ 27 ноября 2011

Я очень новичок в скрипте Powershell.

Я пытаюсь запустить скрипт powershell из cmd

powershell.exe Set-ExecutionPolicy Unrestricted
powershell.exe .\startup.ps1

Мне нужны две строки в скрипте powershell.

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"

%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool"

Могу я просто написать это в файле ps1?

& %WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"

Большое спасибо

Ответы [ 2 ]

12 голосов
/ 27 ноября 2011

Краткий ответ, включая вопрос: Какого черта это должен быть скрипт PowerShell?

Вы можете просто создать командный файл, содержащий

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"
%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool"

и запустите его напрямую, вместо того, чтобы пытаться выяснить политики выполнения и т. д.

Кроме того, appcmd должен , вероятно быть в вашем PATH, так что вы можете запустить его напрямую, без необходимостичтобы указать полный путь к программе.


Более длинный ответ, фактически используя PowerShell: Здесь есть две проблемы.

  1. Выхотите запустить сценарий PowerShell без соответствующей установленной политики выполнения.Это можно сделать с помощью

    powershell -ExecutionPolicy Unrestricted -File myscript.ps1
    
  2. Вам необходимо настроить использование переменных среды в скриптах PowerShell, так как % не используется для расширения там переменных среды.Таким образом, вам действительно нужно

    & $Env:WinDir\system32\inetsrv\appcmd.exe add apppool /name:VCPool /managedRuntimeVersion:v4.0 /managedPipelineMode:Integrated
    & $Env:WinDir\system32\inetsrv\appcmd.exe set app WebRole_IN_0_VC/ /applicationPool:VCPool
    

    Обратите внимание, что вам нужен амперсанд (&) перед каждой строкой, поскольку имя переменной в начале строки переключается в режим выражения , пока выхочу выполнить команду, поэтому требуется режим команды .

    Более того, аргументы в кавычках могут быть проблемой в PowerShell.PowerShell пытается цитировать аргументы, когда это необходимо, и не всегда очевидно, когда что-то идет не так, как на самом деле получается на другом конце.В этом случае самый простой способ - не указывать аргументы каким-либо образом, который обеспечивает их корректность:

    PS Home:\> args add apppool /name:VCPool /managedRuntimeVersion:v4.0 /managedPipelineMode:Integrated
    argv[1] = add
    argv[2] = apppool
    argv[3] = /name:VCPool
    argv[4] = /managedRuntimeVersion:v4.0
    argv[5] = /managedPipelineMode:Integrated
    
    PS Home:\> args set app WebRole_IN_0_VC/ /applicationPool:VCPool
    argv[1] = set
    argv[2] = app
    argv[3] = WebRole_IN_0_VC/
    argv[4] = /applicationPool:VCPool
    

    Однако , если appcmd фактически нуждается кавычки вокруг аргумента после двоеточия, затем вам нужно заключить весь аргумент в кавычки single и добавить двойные кавычки обратно в:

    & $Env:WinDir\system32\inetsrv\appcmd.exe set app WebRole_IN_0_VC/ '/applicationPool:"VCPool"'
    
0 голосов
/ 27 ноября 2011

Возможно, вы хотели бы знать, что вы можете объединить два оператора запуска в один вызов в вашем файле CMD:

powershell.exe -noprofile -executionpolicy unrestricted -file .\startup.ps1

Единственная немного странная вещь при вызове appcmd.exe из PowerShell - вы должны заключать параметр в кавычки, даже если он не содержит пробелов. Вы уже сделали это, так что да, это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...