В чем разница между Powershell -command и -argumentlist?

В чем разница между Powershell -command и -argumentlist?

Поэтому я хотел просто скопировать этот файл в Program Files, где он должен выглядеть примерно так (надо щелкнуть правой кнопкой мыши, запустить от имени администратора):

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

но мне это было нужно в скрипте PowerShell.

Обычный способ повышения уровня:

powershell -command "install_bananas.bat" -Verb runas

но когда я бегу:

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

...который выдал ошибку:

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

Поэтому вместо этого мне придется использовать -argumentlist с Start-Process:

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

Так что, я полагаю, argumentlist используется только Start-Process.

Так что же такоеpowershell -командапротивЗапустить процесс powershell -argumentlistтогда почему возникают проблемы с -Verb runas, когда приходится выполнять команду с несколькими аргументами, например:

Copy-Item A -Destination B

?

ПРИМЕЧАНИЕ: Я думаю, что пришло время купить книгу по Powershell.

решение1

Хотя приобретение книги даст вам кое-что,сначала обратитесь к файлам справкитак как они бесплатны и прямо перед вами. ;-}

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

...
#>

Запустить процесс (Microsoft.PowerShell.Management ... https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7

Параметры

-ArgumentList Указывает параметры или значения параметров, которые будут использоваться при запуске процесса этим командлетом. Аргументы могут быть приняты как одна строка с аргументами, разделенными пробелами, или как массив строк, разделенных запятыми.

Если параметры или значения параметров содержат пробел, их необходимо заключить в экранированные двойные кавычки. Для получения дополнительной информации см. about_Quoting_Rules.

Запуск команды через cmdlet или powershell.exe — это две разные вещи. У каждого есть свои особенности цитирования. Вы получаете эти типы ошибок из-за неправильного синтаксиса, который включает необходимое цитирование.

Итак, в вашем случае Start-Process будет выглядеть примерно так:

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

Для PowerShell.exe что-то вроде этого:

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

Или это

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

Их можно объединить, скажем, если вы находитесь в ISE/VScode и хотите отправить команду новому экземпляру, оставаясь в ISE/VScode, то сделайте что-то вроде этого:

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}

}

Связанный контент