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


94

サーバー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)

これどうやってするの?


4
Copy-Itemを使用するには、 "\\ ServerB \ C $ \ Programs \ temp \ test.txt"のようなUNCパスを使用する必要があります

回答:


95

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

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

9
このアプローチで考えられる問題の1つは、Copy-Itemが代替の資格情報をサポートしないことです(別のユーザーでコマンドを実行する必要がある場合)。その場合、New-PSDriveアプローチが必要です。
ジョーダン

1
このソリューションは、UNC共有をブロックするホスト間にファイアウォールがない場合にのみ機能します。その場合、正しい解決策は次のとおりです(Copy-Item -FromSession)。
Marc

85

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

これが機能するには、コピーが開始されるローカルセッションにPowerShell 5以降がインストールされている必要があります。リモートセッションにPowerShell 5をインストールする必要ありません。これは、PowerShellのバージョンが2以降、Windows Serverのバージョンが2008 R2以降で機能します。[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


3
両方のサーバーにPS 5をインストールする必要がないことがわかりました。ソースサーバー(Windows 10)のみにPS 5がインストールされているテストを実行しました。ターゲットは、デフォルトのPSがインストールされたWindows Server 2012 R2でした($ PSVersionTable.PSVersionレポート4)。
テイラーブキャナン

2
ソースで-ToSessionを使用する場合、ソースのみにPS 5をインストールする必要があります。ターゲットで-FromSessionを使用する場合、ターゲットのみにPS 5をインストールする必要があります。
テイラーブキャナン

1
これは、ハイパーバイザーのみ(サーバーなし)がインストールされている場合にも機能します。セッションを使用するだけで共有をセットアップする必要はありません。
ダッシュ1995年

ありがとうございました!Linuxのscpover sshに似た、素敵でエレガントなソリューション...厄介な共有を気にする必要はありません!
トビアスJ

40

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

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

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

ネット使用: OSのすべての部分で表示される新しいドライブを作成します。

Net use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

これを2回実行すると、次の結果が得られますNew-PSDrive : A specified logon session does not exist. It may already have been terminated->以前のセッションがまだ進行中であると思いますRemove-PSDrive-> 使用しようとしました->それでも機能しません。またnet use <driveLetter> /delete助けにはならなかった。ソフトウェアビルド構成でこのコマンドを実行できるように、他にできることはありますか?
ブルーノビエリ

New-PSDrive2回実行しても意味がないA drive with the name 'Y' already exists.
JPBlanc

2回実行しても意味がないことに同意します。しかし、それはビルドステップに組み込まれており、ビルドは1日に数回実行されます。したがって、私のアプローチは、必要な作業を行ったらドライブを取り外すことであり、新しいビルドが実行されたらドライブを再作成しても問題ないと想定していました。しかし、それは問題のようです。他に何かヒントはありますか?
ブルーノビエリ

マウントする前にマウントされているかどうかのテストはどうですか?または、このパスを使用するすべてのハンドルが閉じていることが確実な場合は、スクリプトでRemove-PSDriveを使用できます。
JPBlanc 2018

16

リモートファイルにアクセスするために資格情報が必要な場合に備えて、コマンドレットNew-Objectを使用してSystem.Net.WebClientオブジェクトを生成し、「リモートでファイルをコピー」することができます。

$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)

1
@klm_どういう意味ですか?
FastTrack

0

上記の答えはどれもうまくいきませんでした。私はこのエラーを受け続けました:

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

だからこれは私のためにそれをしました:

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

次に、ホストから私のマシンを実行ボックスに入れて、これを実行しました:

\\{IP address of nanoserver}\C$

1
おそらく、共有+ファイルシステムのアクセス権で問題が発生した可能性があります。最も制限の厳しいアクセス許可が優先されることに注意してください。NTFSファイルシステムレイヤーでアクセスできる場合でも、共有のアクセス許可で制限されていると、書き込みができなくなります。:)
Trevor Sullivan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.