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

따라서 대신 Start-Process와 함께 -argumentlist를 사용해야 합니다.

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

그래서 인수 목록은 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 이 cmdlet이 프로세스를 시작할 때 사용할 매개 변수 또는 매개 변수 값을 지정합니다. 인수는 공백으로 구분된 인수가 포함된 단일 문자열 또는 쉼표로 구분된 문자열 배열로 허용될 수 있습니다.

매개변수 또는 매개변수 값에 공백이 포함된 경우 이스케이프된 큰따옴표로 묶어야 합니다. 자세한 내용은 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}

}

관련 정보