我使用PowerShell远程连接到另一台计算机,非常好。可以做很多,但如何编辑文件?
PS C:\ Users \ guutlee> 输入-PSSession -ComputerName appprod
[appprod]:PS C:\ Users \ guutlee \ Documents> cd \ myapp
[appprod]:PS C:\ myapp>
如何在远程计算机上的文件上打开文件编辑器?
[appprod]:PS C:\ myapp>编辑app.config
所以编辑“filename”似乎挂起,来自powershell.exe或来自powershell_ise.exe
我唯一能想到的就是退出pssession和“start \ webprod \ c $ \ inetpub \ myapp \ web.config”,这将打开visual studio。
[appprod]:PS C:\ myapp>出口
PS C:\ Users \ guutlee> start \ agobuild \ c $ \ myapp \ app.config
PS C:\ Users \ guutlee> 输入-PSSession -ComputerName appprod
[appprod]:PS C:\ Users \ guutlee \ Documents> cd \ myapp
[appprod]:PS C:\ myapp>的 MyApp.exe的
当然,我必须重新找到该文件,希望c $共享可用且可访问,并重新连接我的pssession并在我想继续时重新找到我的工作目录。它似乎不太优雅。
我可以把它包裹起来这是一个功能,但很难绕过那个......
那么如何使用远程pssession方便地编辑文件?
修改
kbrimington的帖子让我想到了ssh的-X选项。对于PowerShell会话而言,将窗口应用程序转发回原始窗口环境可能会是一件非常棒的事情......
但我仍然很高兴只是编辑文件。
修改
使用vi,emacs,cmd和编辑进行测试
PS C:\ Users \ Meredith> 输入-PSSession -ComputerName appprod
[appprod]:PS C:\ Users \ guutlee \ Documents> C:\ vim \ vim72 \ vim filename.txt
[appprod]:PS C:\ Users \ guutlee \ Documents> C:\ emacs-23.2 \ bin \ emacs.exe -nw filename.txt
emacs.exe:emacs:标准输入不是tty
+ CategoryInfo \: NotSpecified: (emacs: standard input is not a tty:String) [], RemoteException + FullyQualifiedErrorId \: NativeCommandError
[appprod]:PS C:\ Users \ guutlee \ Documents>的 CMD
Microsoft Windows [Version 6.1.7600]
版权所有(c)2009 Microsoft Corporation。保留所有权利。
C:\用户\ guutlee \文件>
[appprod]:PS C:\ Users \ guutlee \ Documents> 编辑filename.txt
vi并编辑挂起(Control-C获取提示)
cmd运行,产生提示,但会立即退回到powershell提示符
emacs产生错误(标准输入不是tty)
修改
Jered建议将文件拉回本地进行编辑。我修饰了他使用pssessions而不是UNC进行复制的答案(也许这就是他的意图)
PS C:\ Users \ Meredith> Invoke-Command -Session $ ps -ScriptBlock {get-content c:/inetpub/myapp/web.config}> web.config
编辑网络配置
PS C:\ Users \ Meredith> get-content web.config | Invoke-Command -Session $ ps -ScriptBlock {set-content c:/inetpub/myapp/web.config}
我们可以在任一方向上运行invoke-commands,本地到远程或远程返回本地。
答案 0 :(得分:21)
如果您使用的是Powershell 5,则可以使用名为PSEdit的命令。它只适用于ISE。
远程文件将在(本地)ISE窗口的新选项卡中打开。
实际上我从this SO question 的评论部分找到了这个答案,但我认为如果我将其作为答案发布在此处对其他人有帮助。
答案 1 :(得分:4)
你能不在本地拉文件,编辑并发布?我知道这很乏味而且不优雅,但似乎编辑目前在远程会话方面存在问题。
如,
Get-Content REMOTE\Filename.txt > LOCAL\Filename.txt
在本地进行更改,然后
Set-Content -path REMOTE\Filename.txt -value (get-content LOCAL\Filename.txt)
修改
另外,如果你只是替换某些实例,你可以很容易地做到这一点。
如,
Get-Content REMOTE\Filename.txt | foreach-object { $_ -replace "OLD", "NEW" } | Set-Content REMOTE\Filename.txt
答案 2 :(得分:4)
经过深入挖掘后,我发现了一些与powershell帮助文档相关的内容。在powershell提示符下,键入:
帮助about_remote_troubleshooting
在显示的帮助文件的最后,有一个标题为“故障排除不相关行为”的部分,其中说明:
故障排除不相关的行为
本节讨论阻止命令的远程处理问题 完成并阻止或延迟Windows PowerShell的返回 提示。
如何中断命令
一些本机Windows程序,例如带有用户界面的程序, 提示输入和控制台的控制台应用程序 使用Win32控制台API的应用程序不起作用 正确地在Windows PowerShell远程主机中。
使用这些程序时,您可能会看到意外行为等 没有输出,部分输出或没有的远程命令 完成。要结束无响应的程序,请键入CTRL + C.查看任何内容 可能已报告的错误,在中键入“$ error” 本地主机和远程会话。
因此,即便是非GUI控制台应用程序(如VIM)也不会令人遗憾。任何人 谨照亮为何可能出现这种情况和/或是否可行 周围?如果我可以使用vim over powershell remoting,我真的很喜欢它。
答案 3 :(得分:3)
PowerShell_ISE.exe \\REMOTE\...\File.txt
将直接加载和编辑文件并一步将其保存回远程计算机,因为它的命令行很容易使用它来构建函数。不会分享问题,但这是我找到的最简单的方法。
答案 4 :(得分:3)
首先,在本地计算机上创建一个临时文件夹(LOCALTEMPFOLDER)。然后,使用以下函数:
function vimrem {param([parameter(position=0,mandatory=$true)][string]$Session, [parameter(position=1,mandatory=$true)][string]$Path)
$TempFile = split-path -path $Path -leaf
copy-item -fromsession $Session -path $Path -destination LOCALTEMPFOLDER\$TempFile
vim $LOCALTEMPFOLDER\$TempFile
copy-item -tosession $Session -path LOCALTEMPFOLDER\$TempFile -destination $Path
remove-item -path LOCALTEMPFOLDER\$TempFile
}
这应该可行,但在使用此功能之前,您将离开交互式会话。
答案 5 :(得分:1)
使用基于控制台的编辑器(如VI或Emacs)进行尝试。在我的评论中,我认为问题在于edit命令绑定到一个窗口化的应用程序,而该窗口应用程序又不是通过远程会话虚拟化的。
答案 6 :(得分:1)
我尝试了以上所有建议,甚至其他微软相关的解决方案,但没有一个按照您和我想要的方式工作 - “完全交互式和响应式shell” - 。如果你真的想拥有unix用户从时间开始的ssh体验,我建议你安装一个ssh服务器。我个人使用freesshd,你可以在http://www.freesshd.com找到它,以及如何在http://www.windowsnetworking.com/articles_tutorials/install-SSH-Server-Windows-Server-2008.html配置它的说明。在完成说明中所说的所有内容之后,您只需使用任何ssh客户端应用程序连接到您的计算机并使用PowerShell完全交互式。 Vim,edit,emacs或用于编辑文件的任何内容都可以正常运行。
我鼓励你不要浪费你的时间与psremoting,telnet,winrs,psexec,试图实现真正的交互式shell提供(我已经失去了它,T_T)。试试ssh服务器,看看你自己。
答案 7 :(得分:0)
受@chenz提供的答案的启发,在Powershell Integrated Shell中使用Visual Studio代码也可以完成此操作。我通过SSH远程处理在Powershell 7中进行了尝试,但也应该与WinRM远程处理一起使用。
Enter-Session ...
[RemoteSystem] PS> psedit service.log
文件名将遵循以下模式:
C:\ users \ dev \ appdata \ local \ temp \ 2 \ pses-15960 \ remotefiles \ 1702137071 \ winboxname \ service.log
答案 8 :(得分:0)
考虑到 PSRemoting 的局限性以及可能的变通方法或解决方案,我一直在对此进行深入研究。
控制台编辑器不起作用,因为它们是本机 (exe) 命令并且基于字符。 (我想知道 cmd over ssh 是否适用于这些)它需要是一个 cmdlet,才能通过 psremote 会话与控制台主机正确交互。
PSRemote 会话是基于行的。您在本地编辑该行按回车键,然后将其发送到远程端,执行命令并返回结果。所以它确实支持行交互,但不支持字符交互。
鉴于所有这些限制,GNU 的 ed 似乎非常适合。我很惊讶没有人考虑将它实现为 cmdlet。
我决定进一步调查这个问题,我检查了 powershell cmdlet read-host
是否工作,然后 C# 等效 PSHostUserInterface.ReadLine()
在 PSRemote 会话上工作,他们这样做了,这就是制作一个工作线编辑器。
这就是我到目前为止所做的。我可能会在更奇特的正则表达式代码上使用一些帮助。
https://github.com/silicontrip/ps-ed
我用它通过 psremote 会话编辑文件。 (我不会用它来编辑大型源文件,但对于奇怪的小配置文件或 ps1 脚本来说,它是完美的。)
在使用此 cmdlet 之前,请确保您熟悉 GNU ED。否则就像第一次尝试使用 VI。
答案 9 :(得分:-1)
我让nano通过SSH轻松地工作到PowerShell。它可以在Chocolatey中使用,所以你可以做...
choco install nano -y
然后你就可以......
nano filename