web-dev-qa-db-ja.com

PowerShellを使用してリモートでファイルをコピーする

サーバーAから実行するPowerShellスクリプトを作成しています。サーバーBに接続し、バックアップとしてサーバーAにファイルをコピーします。

それができない場合、サーバーAからサーバーBに接続し、サーバーBの別のディレクトリにファイルをコピーしたいと思います。

Copy-Item コマンドが表示されますが、コンピューター名を付ける方法が表示されません。

私は次のようなことができると思っていただろう

Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use ServerB or ServerA)

これどうやってするの?

80
chobo2

管理共有を使用して、システム間でファイルをコピーするだけです。この方法ははるかに簡単です。

Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt;

ローカルファイルシステムパスの代わりにUNCパスを使用することにより、これらのUNCパスにアクセスできるクライアントシステムからスクリプトを実行できるようになります。ローカルファイルシステムパスを使用している場合、特定のコンピューターでスクリプトを実行することになります。

これは、両方の管理共有に対する権限を持つユーザーの下でPowerShellセッションが実行される場合にのみ機能します。

サーバーBで通常のネットワーク共有を使用し、全員に読み取り専用でアクセスし、(サーバーAから)単に呼び出すことをお勧めします。

Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose
83
Trevor Sullivan

PowerShellバージョン5以降(Windows Server 2016に含まれる 以前のバージョンのWMF 5の一部としてダウンロード可能 )、これはリモーティングで可能です。この利点は、何らかの理由で共有にアクセスできない場合でも機能することです。

これが機能するには、コピーが開始されるローカルセッションにPowerShell 5以降がインストールされている必要があります。リモートセッションは、PowerShell 5をインストールする必要がありますではありません。最低2のPowerShellバージョンと最低2008 R2のWindows Serverバージョンで動作します。[1]

サーバーAから、サーバーBへのセッションを作成します。

$b = New-PSSession B

そして、まだAから:

Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt

アイテムをBにコピーするには、-ToSessionを使用します。どちらの場合もローカルパスが使用されることに注意してください。使用しているサーバーを追跡する必要があります。


[1]:PowerShell 2のみを備えたリモートサーバーとの間でコピーを行う場合、 PowerShell 5.1のこのバグ に注意してください。これは、執筆時点では-ToSessionでは動作しません-FromSessionでは、明らかにコピーはまったく機能しません。

64
Jeroen Mostert

Net UseまたはNew-PSDriveを使用して、新しいドライブを作成します。

New-PsDrive: PowerShell環境でのみ表示される新しいPsDriveを作成します。

New-PSDrive -Name Y -PSProvider filesystem -Root \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

Net Use: OSのすべての部分に表示される新しいドライブを作成します。

Net Use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy
36
JPBlanc

リモートファイルにアクセスするために資格情報が必要な場合に備えて、コマンドレットを使用してSystem.Net.WebClientオブジェクトを生成できますNew-Object to "Copy File Remotely"、そのようです

$Source = "\\192.168.x.x\somefile.txt"
$Dest   = "C:\Users\user\somefile.txt"
$Username = "username"
$Password = "password"

$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)

$WebClient.DownloadFile($Source, $Dest)

または、ファイルをアップロードする必要がある場合は、UploadFileを使用できます。

$Dest = "\\192.168.x.x\somefile.txt"
$Source   = "C:\Users\user\somefile.txt"

$WebClient.UploadFile($Dest, $Source)
13
shyan1

なし上記の回答のうち、私にとってはうまくいきました。私はこのエラーを受け取り続けました:

Copy-Item : Access is denied
+ CategoryInfo          : PermissionDenied: (\\192.168.1.100\Shared\test.txt:String) [Copy-Item], UnauthorizedAccessException>   
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand

thisは私のためにそれをしました:

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

次に、[ホスト]から[実行]ボックスにある私のマシンで、これを実行しました。

\\{IP address of nanoserver}\C$
0
RogerW