36

我正在使用 powershell 远程连接到另一台计算机,非常好。可以做很多事情,但是如何编辑文件?

PS C:\Users\guutlee> Enter-PSSession -ComputerName appprod

[appprod]: PS C:\Users\guutlee\Documents> cd \myapp

[appprod]: PS C:\myapp>

我该怎么做才能在远程机器上的文件上打开文件编辑器?

[appprod]: PS C:\myapp> 编辑 app.config

所以编辑“文件名”似乎挂了,从 powershell.exe 或从 powershell_ise.exe

我唯一能想到的就是退出 pssession 并“启动 \webprod\c$\inetpub\myapp\web.config”,这将打开 Visual Studio。

[appprod]: PS C:\myapp> 退出

PS C:\Users\guutlee>开始 \agobuild\c$\myapp\app.config

PS C:\Users\guutlee> Enter-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> Enter-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 文件名.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 [版本 6.1.7600]

版权所有 (c) 2009 Microsoft Corporation。版权所有。

C:\用户\guutlee\文档>

[appprod]: PS C:\Users\guutlee\Documents>编辑文件名.txt

vi 和编辑挂起(Control-C 得到提示)

cmd 运行,产生一个提示,但立即退出到 powershell 提示

emacs 产生错误(标准输入不是 tty)

编辑

Jered 建议将文件拉回本地进行编辑。我用 pssessions 而不是 UNCs 修饰了他对复制的回答(也许这就是他的意图)

PS C:\Users\Meredith> Invoke-Command -Session $ps -ScriptBlock {get-content c:/inetpub/myapp/web.config} > web.config

编辑网页配置

PS C:\Users\Meredith>获取内容 web.config | 调用命令 -Session $ps -ScriptBlock {set-content c:/inetpub/myapp/web.config}

潜在地,我们可以在任一方向运行调用命令,本地到远程或远程返回到本地。

4

10 回答 10

27

如果您使用的是 Powershell 5,则可以使用名为 PSEdit 的命令。它仅适用于 ISE。

  1. 所以首先,打开 PowerShell ISE
  2. 然后使用 Enter-PSSession 打开与远程计算机的远程会话
  3. 然后使用 PsEdit 'filename' 编辑文件

远程文件将在(本地)ISE 窗口的新选项卡中打开。

实际上我从这个 SO question的评论部分找到了这个答案,但我认为如果我将它作为答案发布在这里对其他人会有所帮助。

于 2016-03-11T09:19:18.490 回答
4
PowerShell_ISE.exe \\REMOTE\...\File.txt 

将直接加载和编辑文件,然后一步将其保存回远程计算机,并且由于它的命令行,使用它很容易构建功能。无法解决共享问题,但我找到了最简单的方法。

于 2012-01-21T07:55:27.690 回答
4

经过大量挖掘,我在 powershell 帮助文档中发现了一些似乎相关的内容。在 powershell 提示符下,键入:

帮助 about_remote_troubleshooting

在显示的帮助文件的最后,有一个标题为“故障排除无响应行为”的部分,其中指出:

对反应迟钝的行为进行故障排除

本节讨论阻止命令完成以及阻止或延迟返回 Windows PowerShell 提示符的远程处理问题。

如何中断命令


某些本机 Windows 程序(例如具有用户界面的程序、提示输入的控制台应用程序以及使用 Win32 控制台 API 的控制台应用程序)在 Windows PowerShell 远程主机中无法正常工作。

当您使用这些程序时,您可能会看到意外的行为,例如无输出、部分输出或未完成的远程命令。要结束无响应的程序,请键入 CTRL + C。要查看可能已报告的任何错误,请在本地主机和远程会话中键入“$error”。

因此,不幸的是,即使是非 GUI 控制台应用程序(如 VIM)似乎也无法正常工作。任何人都想了解一下为什么会出现这种情况和/或是否可以解决?如果我可以使用 vim 而不是 powershell 远程处理,我会非常喜欢它。

于 2011-09-23T20:59:59.767 回答
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
于 2010-08-17T00:44:09.677 回答
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

}

这应该可以工作,但在使用此功能之前,您需要离开一个交互式会话。

于 2018-02-12T21:29:16.350 回答
1

尝试使用基于控制台的编辑器,例如 VI 或 Emacs。在我的评论中,我认为问题在于编辑命令绑定到一个窗口应用程序,而该应用程序又不是跨远程会话虚拟化的。

于 2010-08-08T03:06:31.537 回答
1

我尝试了上述所有建议,甚至其他与微软相关的解决方案,但没有一个能以你和我想要的方式工作——“完全交互式和响应式外壳”——。如果你真的想拥有 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 服务器,看看你自己。

于 2011-03-15T20:11:11.250 回答
1

受@chenz 提供的答案的启发,这也可以在 Powershell Integrated Shell 中使用 Visual Studio Code 完成。我在 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

于 2020-08-02T21:06:52.227 回答
0

我让 nano 通过 SSH 到 PowerShell 轻松工作。它在 Chocolatey 中可用,所以你可以做...

choco install nano -y

然后你可以做...

nano filename
于 2017-03-04T12:27:45.753 回答
0

鉴于 PSRemoting 的局限性以及可能的变通方法或解决方案,我一直在非常彻底地研究这一点。

控制台编辑器不起作用,因为它们是本机 (exe) 命令并且是基于字符的。(我想知道 cmd over ssh 是否适用于这些)它需要是一个 cmdlet 才能通过 psremote 会话与控制台主机正确交互。

PSRemote 会话是基于行的。您在本地编辑该行 push enter 然后将其发送到远程端,执行命令并返回结果。所以它确实支持行交互但不支持字符交互。

鉴于所有这些限制,GNU 的 ed 似乎是一个完美的选择。我很惊讶没有人考虑将它作为一个 cmdlet 来实现。

我决定对此进行进一步调查,我检查了 powershell cmdlet 是否read-host可以正常工作,然后 C# 等效PSHostUserInterface.ReadLine()项在 PSRemote 会话上工作,它们确实可以工作,这就是制作工作行编辑器所需的全部内容。

所以这就是我到目前为止所做的。我可能会在更奇特的正则表达式代码上使用一些帮助。

https://github.com/silicontrip/ps-ed

我用它通过 psremote 会话编辑文件。(我不会用它来编辑大型源文件,但对于奇怪的小配置文件或 ps1 脚本来说,它是完美的。)

在使用此 cmdlet 之前,请确保您熟悉 GNU ED。这就像第一次尝试使用 VI,否则。

于 2021-07-29T05:43:13.120 回答