web-dev-qa-db-ja.com

PowerShellリモート処理セッション(Powershell)でファイルを編集する方法

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> edit app.config

そのため、powershell.exeまたはpowershell_ise.exeから「ファイル名」を編集するとハングするようです。

私が考えることができる唯一のことは、pssessionから戻って、「\ webprod\c $\inetpub\myapp\web.configを開始する」ことです。これにより、Visual Studioが開きます。

[appprod]:PS C:\ myapp> exit

PS C:\ Users\guutlee> start\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、およびeditを使用したテスト

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 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 [バージョン6.1.7600]

Copyright(c)2009 Microsoft Corporation。全著作権所有。

C:\ Users\guutlee\Documents>

[appprod]:PS C:\ Users\guutlee\Documents> edit filename.txt

viおよび編集ハング(プロンプトを戻すにはControl-C)

cmdは実行され、プロンプトが生成されますが、すぐに終了してpowershellプロンプトに戻ります

emacsはエラーを生成します(標準入力はttyではありません)

編集

Jeredは、ファイルをローカルに引き戻して編集することを提案しています。 UNCではなくPssessionを使用してコピーすることに対する彼の答えを飾りました(おそらくこれが彼の意図したことでしょう)

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コマンドを実行できます。

33
guutlee

Powershell 5を使用している場合は、PSEditというコマンドを使用できます。 ISEからのみ機能します。

  1. 最初に、PowerShell ISEを開きます
  2. 次に、Enter-PSSessionを使用してリモートコンピューターへのリモートセッションを開きます
  3. 次に、PsEdit 'filename'を使用してファイルを編集します

リモートファイルは、(ローカル)ISEウィンドウの新しいタブで開きます。

実際、 this SO question のコメントセクションからこの回答を見つけましたが、ここに回答として投稿すると他の人にとって役立つと思います。

21
chenz

ファイルをローカルでプルし、編集して投稿することはできませんか?これは面倒でエレガントではありませんが、編集者は現在リモートセッションに問題を抱えているようです。

例えば。、

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
4
Jered Odegard

よく調べてみたところ、PowerShellヘルプのドキュメントに関連があると思われるものを見つけました。 PowerShellプロンプトで、次のように入力します。

ヘルプ_about_remote_troubleshooting

表示されるヘルプファイルの最後に、「TROUBLESHOOTING UNRESPONSIVE BEHAVIOUR」というタイトルのセクションがあります。

応答しない動作のトラブルシューティング

このセクションでは、コマンドの完了を妨げ、Windows PowerShellプロンプトの戻りを防止または遅延させるリモート処理の問題について説明します。

コマンドを中断する方法


ユーザーインターフェイスを備えたプログラム、入力を求めるコンソールアプリケーション、Win32コンソールAPIを使用するコンソールアプリケーションなど、一部のネイティブWindowsプログラムは、Windows PowerShellリモートホストで正常に動作しません。

これらのプログラムを使用すると、出力なし、部分的な出力、完了しないリモートコマンドなどの予期しない動作が発生する場合があります。応答しないプログラムを終了するには、CTRL + Cを入力します。報告された可能性のあるエラーを表示するには、ローカルホストおよびリモートセッションで「$ error」と入力します。

したがって、VIMのような非GUIコンソールアプリケーションでさえ、残念ながら動作しません。 PowerShellのリモート処理でvimを使用できれば、本当に気に入っています。

4
dtm

最初に、ローカルマシン(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

}

これは機能するはずですが、この機能を使用する前に対話型セッションを終了する必要があります。

3
Henrique
PowerShell_ISE.exe \\REMOTE\...\File.txt 

ファイルを直接読み込んで編集し、ワンステップでリモートコンピューターに保存します。コマンドラインなので、それを使用して機能を簡単に構築できます。共有の問題を回避することはできませんが、私が見つけた最も簡単な方法です。

3
Lor

上記のすべての提案と他のマイクロソフト関連のソリューションを試してみましたが、あなたや私が望む方法で動作するものはありません-「完全なインタラクティブで応答性の高いシェル」- UNIXユーザーが時間の初めから持っているssh体験を本当にしたい場合は、sshサーバーをインストールすることをお勧めします。私は個人的にfreesshdを使用しています。ここで見つけることができます http://www.freesshd.com とここで設定する方法の説明 http://www.windowsnetworking.com/articles_tutorials/ install-SSH-Server-Windows-Server-2008.html 。手順に記載されていることをすべて行った後は、sshクライアントアプリを使用してコンピューターに接続し、PowerShellフルインタラクティブを使用するだけです。 Vim、編集、emacs、またはファイルの編集に使用するものはすべて問題なく機能します。

psremoting、telnet、winrs、psexecで時間を無駄にしないことをお勧めします。実際のインタラクティブなシェルが提供するものを達成しようとしています(すでに失っています、T_T)。そのsshサーバーを試してみてください。

1
mjsr

VIやEmacsなどのコンソールベースのエディターを使用して試してください。私のコメントのように、問題は、編集コマンドがウィンドウ化されたアプリケーションにバインドされており、そのアプリケーションがリモートセッションで仮想化されていないことだと思います。

1
kbrimington