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