Entonces quería simplemente copiar este archivo en Archivos de programa, donde debe ser así (tengo que hacer clic derecho, ejecutar como Administrador):
Copy-Item \\Poplar\SuperSound -Destination 'C:\Program Files\' -Force -Recurse
pero lo necesitaba en un script de PowerShell.
La forma habitual en que puedo elevar es con:
powershell -command "install_bananas.bat" -Verb runas
pero cuando corro:
powershell -command "Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse" -Verb runas
...que arrojó un error:
Copy-Item : A positional parameter cannot be found that accepts argument 'runas'.
Entonces tengo que usar -argumentlist con Start-Process:
Start-Process powershell -Verb runas -argumentlist "Copy-Item \\Poplar\SuperSound -Destination 'C:\Program Files\' -Force -Recurse"
Así que supongo que la lista de argumentos solo la usa Start-Process.
Entonces que escomando powershellversusInicio del proceso powershell -argumentlistentonces y por qué tiene problemas con -Verb runas cuando tiene que ejecutar un comando de múltiples argumentos como:
Copy-Item A -Destination B
?
NOTA: Creo que finalmente es hora de comprar un libro de Powershell.
Respuesta1
Aunque conseguir un libro te dará cosas,acceda primero a los archivos de ayudaya que están libres y justo frente a ti. ;-}
# Get specifics for a module, cmdlet, or function
(Get-Command -Name Start-Process).Parameters
(Get-Command -Name Start-Process).Parameters.Keys
# Results
<#
FilePath
ArgumentList
Credential
WorkingDirectory
LoadUserProfile
NoNewWindow
PassThru
RedirectStandardError
RedirectStandardInput
RedirectStandardOutput
Verb
WindowStyle
Wait
UseNewEnvironment
Verbose
Debug
ErrorAction
WarningAction
InformationAction
ErrorVariable
WarningVariable
InformationVariable
OutVariable
OutBuffer
PipelineVariable
#>
Get-help -Name Start-Process -Examples
# Results
<#
Start-Process -FilePath "sort.exe"
Start-Process -FilePath "myfile.txt" -WorkingDirectory "C:\PS-Test" -Verb Print
Start-Process -FilePath "Sort.exe" -RedirectStandardInput "Testsort.txt" -RedirectStandardOutput "Sorted.txt" -RedirectStandardError
Start-Process -FilePath "notepad" -Wait -WindowStyle Maximized
Start-Process -FilePath "powershell" -Verb runAs
$startExe = New-Object System.Diagnostics.ProcessStartInfo -Args PowerShell.exe
$startExe.verbs
Start-Process -FilePath "powershell.exe" -Verb open
Start-Process -FilePath "powershell.exe" -Verb runas
#>
Get-help -Name Start-Process -Full
Get-help -Name Start-Process -Online
powershell /?
# Results
<#
PowerShell[.exe] [-PSConsoleFile <file> | -Version <version>]
[-NoLogo] [-NoExit] [-Sta] [-Mta] [-NoProfile] [-NonInteractive]
[-InputFormat {Text | XML}] [-OutputFormat {Text | XML}]
[-WindowStyle <style>] [-EncodedCommand <Base64EncodedCommand>]
[-ConfigurationName <string>]
[-File <filePath> <args>] [-ExecutionPolicy <ExecutionPolicy>]
[-Command { - | <script-block> [-args <arg-array>]
| <string> [<CommandParameters>] } ]
...
-Command
Executes the specified commands (and any parameters) as though they were
typed at the Windows PowerShell command prompt, and then exits, unless
NoExit is specified. The value of Command can be "-", a string. or a
script block.
If the value of Command is "-", the command text is read from standard
input.
If the value of Command is a script block, the script block must be enclosed
in braces ({}). You can specify a script block only when running PowerShell.exe
in Windows PowerShell. The results of the script block are returned to the
parent shell as deserialized XML objects, not live objects.
If the value of Command is a string, Command must be the last parameter
in the command , because any characters typed after the command are
interpreted as the command arguments.
To write a string that runs a Windows PowerShell command, use the format:
"& {<command>}"
where the quotation marks indicate a string and the invoke operator (&)
causes the command to be executed.
...
#>
Proceso de inicio (Microsoft.PowerShell.Management... https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7
Parámetros
-ArgumentList Especifica parámetros o valores de parámetros que se usarán cuando este cmdlet inicie el proceso. Los argumentos se pueden aceptar como una sola cadena con los argumentos separados por espacios o como una matriz de cadenas separadas por comas.
Si los parámetros o valores de parámetros contienen un espacio, deben estar entre comillas dobles escapadas. Para obtener más información, consulte about_Quoting_Rules.
Ejecutar un comando a través de un cmdlet o powershell.exe son dos cosas diferentes. Cada uno tiene sus detalles de cotización. Obtiene este tipo de errores debido a una sintaxis incorrecta que incluye citas necesarias.
Entonces, para su caso de uso, Start-Process sería algo como esto:
$ConsoleCommand = "Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse"
Start-Process powershell -ArgumentList '-NoExit',"-Command &{ $ConsoleCommand }"
Para PowerShell.exe, algo como esto:
PowerShell -Command {Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse}
O esto
PowerShell -Command "& {Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse}"
Se pueden combinar, digamos que si está en ISE/VSCode y desea enviar un comando a una nueva instancia mientras permanece en ISE/VSCode, entonces, algo como esto:
Function Start-ConsoleCommand
{
[CmdletBinding(SupportsShouldProcess)]
[Alias('scc')]
Param
(
[string]$ConsoleCommand,
[switch]$PoSHCore
)
If ($PoSHCore)
{Start-Process pwsh -ArgumentList "-NoExit","-Command &{ $ConsoleCommand }" -Wait}
Else
{Start-Process powershell -ArgumentList "-NoExit","-Command &{ $ConsoleCommand }" -Wait}
}