Running powershell wihtin standard cmd with parameters? - powershell

I have downloaded the dotnet installer PS1 script file from here.
I wish to run it, and MS recommended:
dotnet-install.ps1 -Channel 7.0 -Runtime aspnetcore
Okay, but I have to run this in a non-powershell "cmd", so I'll have to specify "powershell":
powershell ./dotnet-install.ps1 -Channel 7.0 -Runtime
UnauthorizedAccess
powershell ./dotnet-install.ps1 -Channel 7.0 -Runtime -ExecutionPolicy RemoteSigned
UnauthorizedAccess
powershell -ExecutionPolicy RemoteSigned ./dotnet-install.ps1 -Channel 7.0 -Runtime
MissingArgument
How can I write this command to be able to run?
And how can I write if "dotnet-install.ps1" contains whitespace in its path?

To run the installation script from cmd.exe with elevation (as admin) - which will invariably prompt for confirmation / ask for administrator credentials - try the following:
powershell.exe Start-Process -Verb RunAs powershell.exe '-ExecutionPolicy Bypass -NoExit -File ./dotnet-install.ps1 -Channel 7.0 -Runtime aspnetcore'
If your .ps1 script file path contains spaces, enclose it in \"...\" (sic); e.g.,
\"C:\path with spaces\dotnet-install.ps1\"
Note that the elevated script invariably runs in a new window; the -NoExit CLI option in the nested powershell.exe call keeps that window open after the script terminates, which allows you to inspect output.
You may add -Wait to the Start-Process call above to make the calling cmd.exe shell wait for new window to close.
See also:
powershell.exe, the Windows PowerShell CLI.
PowerShell's Start-Process cmdlet, which allows launching processes with elevation via -Verb RunAs.

Related

Running a powershell script as administrator and minimized

So I have set up a task on task scheduler to run a .bat file that runs a powershell script as admin which sets the DNS settings. I figured out how to make the .bat file run minimised, but the powershell window still pops up. Here is the script for the .bat file called "SetDNS". The powershell script's name is "DNS.ps1".
#ECHO OFF
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%DNS.ps1
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%C:\Users\Test\Downloads\DNS.ps1%""' -Verb RunAs}";
I want to change it so that the powershell script does not flash open while it runs. Is there something that I could add to the above code to make it run minimized? I tried to add "start /min" to the above code but it did not work. Help is appreciated.

Powershell / cmd - Redirecting embedded script's output streams to file

I have a situation in which a cmd script must launch a powershell script (install.ps1), elevating to admin if the cmd is not already. The line that launches the powershell looks like this:
powershell -WindowStyle Hidden "Start-Process powershell \"-NoP -Exec Bypass -File `\"%~dp0install.ps1`\" %args%\" -Verb runAs -Wait"
Or this also works:
powershell -WindowStyle Hidden "Start-Process powershell \"-NoP -Exec Bypass invoke-command { %~dp0install.ps1 %args% } \" -Verb runAs -Wait"
I would like to redirect the output from the install.ps1 script to a file for logging purposes, but having trouble doing this. Something like the following will generate the log.txt file, but output will still be shown in the console and the resulting log.txt file will be empty:
powershell -WindowStyle Hidden "Start-Process powershell \"-NoP -Exec Bypass invoke-command { %~dp0install.ps1 %args% } \" *> log.txt -Verb runAs -Wait"
Moving the *> log.txt portion to inside the Start-Process block (just after the invoke-command block), which I thought would be the key, seems to not even run the script at all (or it's flashing an error in the console too quick to see because it closes immediately).
Is it possible to achieve this logging behavior when the data I want is buried in a couple layers of powershell, executed by a cmd file?
We've technically gotten this to work by creating a powershell wrapper script that is called/elevated by the cmd, then within the wrapper calling the install.ps1 script and assigning logging in that call. Unfortunately the extra script layer causes a bunch of other tricky / more critical problems regarding getting arguments passed at the command line all the way through to the actual install script correctly, so we're really trying to avoid that route.
EDIT
Thanks to #mklement0 for the pointer that the redirect needed to be escaped, which was my problem. Follow-up question - The following command works great to log to file, but is there any way to get this same behavior using -File rather than -Command when invoking the PS script ("-Command %~dp0pg.ps1")?
powershell -Command "Start-Process -WindowStyle Hidden -Verb RunAs -Wait powershell \"-NoProfile -ExecutionPolicy Bypass -Command %~dp0pg.ps1 *^> %CD%\log.txt\""
Moving the *>log.txt redirection into the Invoke-Command block works in principle, but your problem is that in Windows PowerShell (as opposed to PowerShell Core) a process invoked with elevation (as admin), via -Verb RunAs, defaults to C:\Windows\System32 as the working directory, not the caller's working dir.
Aside from the fact that you probably didn't mean to create a log file in C:\Windows\System32, the command will fail, because writing to that location requires the caller to already be elevated.
The simplest solution is to make *> redirect to a file specified with a full path instead:
powershell -Command "Start-Process -WindowStyle Hidden -Verb RunAs -Wait powershell \"-NoProfile -ExecutionPolicy Bypass -Command %~dp0pg.ps1 *^> %CD%\log.txt\""
Note:
There is no need for Invoke-Command - just invoke the *.ps1 file directly; however, I've added -Command to make it more obvious that the remainder of the command line is to be interpreted as PowerShell code (not a script-file path with arguments only).
Because > is a cmd.exe metacharacter, it must be escaped as ^> in order to be passed through to PowerShell - perhaps surprisingly, cmd.exe considers the > to be unquoted, because it doesn't recognize the \" sequences as embedded double quotes - only PowerShell does.
As in your original command, the assumption is that neither %~dp0 - the batch file's folder dir. path - nor %CD% - the caller's working dir. path - contain spaces or other special chars. that would need additional quoting / escaping.

Windows PowerShell to install NativeScript on Windows 10

I try to install NativeScript on Windows 10 from Admin PowerShell console.
https://docs.nativescript.org/start/ns-setup-win
I type this command and obtain the following error:
#powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://nativescript.org/setup/win-avd'))"
You're running the command from PowerShell when you need to run it from CMD command prompt.
Run this from CMD:
#powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://nativescript.org/setup/win-avd'))"
Here, #powershell means "don't echo the command and run powershell.exe". It means something completely different in PowerShell itself, where #powershell means "search the path and execute a program with the literal name #powershell before the extension" or "use the variable $powershell as a splat variable" depending on your PowerShell version.
If you're running it in Powershell, you'll need to run just:
iex ((new-object net.webclient).DownloadString('https://nativescript.org/setup/win-avd'))
As always, be extremely careful about running these commands that download arbitrary code and execute it immediately.

How to run PowerShell Start-Process without closing the output window?

I am trying to run the following PowerShell command in CMD:
powershell -Command "Start-Process MSBuild.exe MyProject.sln -Verb RunAs"
I'm running this in PowerShell so that I can get the UAC (for elevated privileges). I'm not sure if there is an equivalent in CMD.
Now, I run the PowerShell script from within a batch file, so that I can double-click and execute. (or put it in the $Path location and call it from anywhere)
But the problem is as soon as it finishes running, it immediately closes, and I cannot see the build error message if any.
How can I wait or pause when MSBuild.exe has finished executing in a new window?
The noexit command keeps your PowerShell window open.
powershell -noexit -Command "Start-Process MSBuild.exe MyProject.sln -Verb RunAs"
in your batch file, add pause to the end
powershell -Command "Start-Process MSBuild.exe MyProject.sln -Verb RunAs"
pause
The issue you're seeing is the command window closing after executing everything in the batch file, rather than powershell closing the shell after it executes.

Run powershell in new window

I would like to run new powershell window with parameters. I was trying to run following:
powershell -Command "get-date"
but everything happens in same console. Is there a simple way to do this?
To open a new PowerShell Window from PowerShell:
Start-Process PowerShell
Or my personal favorite:
Start-Process PowerShell -WindowStyle Maximized
Then you could typeGet-Datewithout having to deal with the -ArgumentList's tendency to close itself. I still haven't found a way to open a new PowerShell process with the -ArgumentList Parameter, without it immediately closing after it runs. For Instance:
Start-Process PowerShell -ArgumentList "Get-Date"
or simply
Start-Process PowerShell -ArgumentList Get-Date
Will Close Immediately after running the process.
In order to get it to wait before closing you could add:
Start-Process PowerShell -ArgumentList 'Get-Date; Read-Host "Press Enter"'
Since the -Wait Parameter seems to do nothing at all in this case.
FYI - PowerShell Suggested Syntax is actually:
Start-Process -FilePath "powershell.exe"
But since PowerShell is a standard Windows Application in the %SystemRoot%\system32 Environment Variables the command line(s) should recognize a simple
Powershell
Command
Use the start command. In a CMD prompt, try:
start powershell -noexit -command "get-date"
For Start/Run (or Win+r) prompt, try:
cmd /c start powershell -noexit -command "get-date"
The -noexit will tell Powershell to, well, not to exit. If you omit this parameter, the command will be executed and you are likely to just see a glimpse of a Powershell window. For interactive use, this is a must. For scripts it is not needed.
Edit:
start is an internal command for CMD. In Powershell it is an alias for Start-Process. These are not the same thing.
As for why the window is black, that's because the shortcut for Powershell.exe is configured to set the background blue.
To call a PowerShell (PS) script in a second terminal window without exiting, you can use a script similar to:
Start-Process PowerShell -ArgumentList "-noexit", "get-date"
or if you need to run another script from a specific location:
Start-Process PowerShell -ArgumentList "-noexit", "-command .\local_path\start_server.ps1"