2 votes

Quelle est la différence entre Powershell -command et -argumentlist ?

J'ai donc voulu copier ce fichier dans Program Files, où il doit être comme ceci (il faut faire un clic droit, exécuter en tant qu'administrateur) :

Copy-Item \\Poplar\SuperSound -Destination 'C:\Program Files\' -Force -Recurse

mais j'en avais besoin dans un script powershell script.

La façon habituelle d'élever est de le faire avec :

powershell -command "install_bananas.bat" -Verb runas

mais quand je cours :

powershell -command "Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse" -Verb runas

...qui a craché une erreur :

Copy-Item : A positional parameter cannot be found that accepts argument 'runas'.

Je dois donc utiliser -argumentlist avec Start-Process :

Start-Process powershell -Verb runas -argumentlist "Copy-Item \\Poplar\SuperSound -Destination 'C:\Program Files\' -Force -Recurse" 

Je suppose donc que argumentlist n'est utilisé que par Start-Process.

Qu'est-ce que la powershell -commande par rapport à Démarrer le processus powershell -argumentlist alors et pourquoi rencontre-t-il des problèmes avec -Verb runas lorsqu'il doit exécuter une commande à plusieurs arguments comme :

Copy-Item A -Destination B

?

NOTE : Je pense qu'il est enfin temps d'acheter un livre sur Powershell.

2voto

postanote Points 3762

Cependant, l'achat d'un livre vous permettra d'obtenir des informations, consultez d'abord les fichiers d'aide puisqu'ils sont gratuits et sous vos yeux. ;-}

# 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.

...
#>

Start-Process (Microsoft.PowerShell.Management ... https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7

Paramètres

-ArgumentList Spécifie les paramètres ou les valeurs de paramètres à utiliser lorsque cette cmdlet démarre le processus. Les arguments peuvent être acceptés sous la forme d'une avec les arguments séparés par des espaces, ou sous la forme d'un tableau de chaînes chaînes de caractères séparées par des virgules.

Si les paramètres ou les valeurs des paramètres contiennent un espace, ils doivent être doivent être entourés de guillemets doubles échappés. Pour plus d'informations, voir about_Quoting_Rules.

L'exécution d'une commande via une cmdlet ou powershell.exe sont deux choses différentes. Chacune a ses propres spécificités. Vous obtenez ce type d'erreurs en raison d'une syntaxe incorrecte qui inclut les guillemets nécessaires.

Ainsi, pour votre cas d'utilisation, Start-Process serait quelque chose comme ceci :

$ConsoleCommand = "Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse"
Start-Process powershell -ArgumentList '-NoExit',"-Command  &{ $ConsoleCommand }" 

Pour PowerShell.exe, quelque chose comme ceci :

PowerShell -Command {Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse}

Ou ceci

PowerShell -Command "& {Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse}"

Ils peuvent être combinés, par exemple si vous êtes dans l'ISE/VScode, et que vous voulez Shelldonner une commande à une nouvelle instance tout en restant dans l'ISE/VSCode, alors, quelque chose comme ceci :

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}

}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X