Houman
Houman

Reputation: 66390

How do I write this in Powershell script?

I am very new to Powershell script.

I am trying to run a powershell script from a cmd

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

I need two lines within powershell script.

%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"

Can I simply write it like this within the ps1 file?

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

Many Thanks

Upvotes: 9

Views: 10265

Answers (2)

Joey
Joey

Reputation: 354854

Short answer, including a question: Why the hell does that need to be a PowerShell script?

You can simply create a batch file containing

%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"

and run that directly instead of trying to figure out execution policies, etc.

Furthermore, appcmd should probably be in your PATH, so you can run it directly without needing to specify the full path to the program.


Longer answer, actually using PowerShell: There are two problems here.

  1. You want to run a PowerShell script without having the appropriate execution policy set. This can be done with

    powershell -ExecutionPolicy Unrestricted -File myscript.ps1
    
  2. You need to adjust environment variable usage within PowerShell scripts, as % is not used to expand environment variables there. So you actually need

    & $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
    

    Note also that you need an ampersand (&) before each line as a variable name in the beginning of a line switches into expression mode while you want to run a command, therefore needing command mode.

    Furthermore quoted arguments can be a bit of a pain in PowerShell. PowerShell tries quoting arguments when necessary and it's not always obvious when things go wrong what actually comes out on the other end. In this case the easiest way is to not quote the arguments in any way whcih ensures that they come out correctly:

    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
    

    However, if appcmd actually needs the quotes around the argument after a colon, then you need to quote the whole argument with single quotes and add the double quotes back in:

    & $Env:WinDir\system32\inetsrv\appcmd.exe set app WebRole_IN_0_VC/ '/applicationPool:"VCPool"'
    

Upvotes: 17

uknzguy
uknzguy

Reputation: 409

You might like to know you can combine the two launch statements into a single call within your CMD file:

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

The only slightly strange thing about calling appcmd.exe from PowerShell is you must surround the parameter in quotes, even if it contains no spaces. You have already done this, so yes it should work.

Upvotes: 0

Related Questions