PowerShell 2.0 sudo的限制

很长时间的读者,但新的海报。 我一直在为这个问题摔跤了一整天,这让我疯狂。 淘了这个网站和谷歌后,我仍然卡住了。 基本上,我无法弄清楚如何在PowerShell中使用Copy-Item CmdLet来实现“sudo”。 这是我的代码:

PROFILE.PS1:

# Trigger UAC to elevate the supplied command function Elevate-Process() { if($args.Length -eq 0) { error ('USAGE: ' + $MyInvocation.InvocationName + ' <executable> [arg1 arg2 arg3 ...]'); } else { try { if($args.Length -eq 1) { Start-Process $args[0] -Verb RunAs; } else { Start-Process $args[0] -ArgumentList $args[1..$args.Length] -Verb RunAs; } } catch { error $_.Exception.Message; } } } # Display pretty-formatted error messages function error() { # Validate function parameters Param( [Parameter(Mandatory=$true)] [ValidateScript({$_.GetType().Name -eq 'String'})] $sMessage ); Write-Host $sMessage -BackgroundColor Yellow -ForegroundColor Red; } # Set aliases set-alias sudo Elevate-Process; 

应用 – INI.PS1:

 sudo Copy-Item '.\standard_menu.ini' 'C:\Program Files (x86)\Opera\ui\'; #sudo [System.IO.File]::Copy '.\webmailproviders.ini' 'C:\Program Files (x86)\Opera\defaults\webmailproviders.ini' $true; Write-Host 'Press any key to exit...'; $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null; 

当我执行powershell.exe。\ apply-ini.ps1时 ,出现以下错误:

由于错误,此命令无法执行:系统找不到指定的文件。

我已经尝试了所有我可能find没有任何运气。 希望有人能指出我正确的方向。

获得一个好的调用升级命令有几个微妙之处。 这是我们在PowerShell社区扩展 (2.1 Beta)中使用的Invoke-Elevated的当前实现。 你可能会发现它有助于让你的工作,或者你可以抓住PSCX 2.1测试版。 🙂

 调用提升的
    以admin身份打开一个新的PowerShell实例。
 。例
     C:\ PS>调用 - 提升记事本C:\ windows \ system32 \ drivers \ etc \ hosts
    使用主机文件打开提升记事本,以便可以保存对文件的更改。
 。例
     C:\ PS>调用 - 提升{gci c:\ windows \ temp |  export-clixml tempdir.xml; 出口}
    在提升的PowerShell实例中执行脚本块。
 。例
     C:\ PS>调用 - 提升{gci c:\ windows \ temp |  export-clixml tempdir.xml; 退出} |  %{$ _。WaitForExit(5000)} |  %{Import-Clixml tempdir.xml}
    在提升的PowerShell实例中执行脚本块,然后等待该提升的进程执行
    检索结果。
 。笔记
    别名:su
    作者:Keith Hill
 #>
功能调用 - 提升 
 {
     Write-Debug“`$ MyInvocation:`n $($ MyInvocation | Out-String)”

     $ startProcessArgs = @ {
         FilePath =“PowerShell.exe”
         ArgumentList =“-NoExit”,“-Command”,“&{Set-Location $ pwd}”
         Verb =“runas”
         PassThru = $ true
         WorkingDir = $ pwd
     }

     $ OFS =“”
    如果($ args.Count -eq 0)      
     {
        写入调试“启动Powershell没有提供参数”
     }
     elseif($ args [0] -is [Scriptblock]) 
     {
         $ script = $ args [0]
         $ cmdArgs = $ args [1 .. $($ args.Length)]
         $ startProcessArgs ['ArgumentList'] =“-NoExit”,“-Command”,“&{Set-Location $ pwd; $ script}”
        如果($ cmdArgs.Count -gt 0)
         {
             $ startProcessArgs ['ArgumentList'] + = $ cmdArgs
         }
        写入调试“启动脚本块的PowerShell:{$ script}和args:$ cmdArgs”
     }
    其他
     {
         $ app = Get-Command $ args [0] | 选择-First 1 |  ?  {$ _。CommandType -eq'Application'}
         $ cmdArgs = $ args [1 .. $($ args.Length)]
        如果($ app){
             $ startProcessArgs ['FilePath'] = $ app.Path
            如果($ cmdArgs.Count -eq 0)
             {
                 $ startProcessArgs.Remove( '参数列表')
             }
            其他
             {
                 $ startProcessArgs ['ArgumentList'] = $ cmdArgs
             }
            写入调试“启动应用程序$应用程序与参数:$ cmdArgs”
         }
         else {
             $ poshCmd = $ args [0]
             $ startProcessArgs ['ArgumentList'] =“-NoExit”,“-Command”,“&{Set-Location $ pwd; $ poshCmd $ cmdArgs}”
            写入调试“启动PowerShell命令$ poshCmd与args:$ cmdArgs”
         }
     }

    写入调试“使用args:$($ startProcessArgs | Format-List | Out-String)调用启动过程” 
     Microsoft.PowerShell.Management \ Start-Process @startProcessArgs
 }

您正在使用cmdlet(copy-item)作为文件路径参数而不是可执行文件的文件路径来调用Start-Process

 sudo xcopy '.\standard_menu.ini' 'C:\Program Files (x86)\Opera\ui\'; 

会做的伎俩。