PowerShell ile dosyayı uzaktan kopyalayın


95

Sunucu A'dan çalıştırmak istediğim bir PowerShell betiği yazıyorum . Sunucu B'ye bağlanmak ve bir dosyayı yedek olarak Sunucu A'ya kopyalamak istiyorum.

Bu yapılamazsa, Sunucu B'ye Sunucu A'dan bağlanmak ve bir dosyayı B Sunucusundaki başka bir dizine kopyalamak istiyorum.

Copy-ItemKomutu görüyorum , ama ona nasıl bir bilgisayar adı vereceğimi bilmiyorum.

Böyle bir şey yapabileceğimi düşünürdüm

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

Bunu nasıl yapabilirim?


4
Öğeyi Kopyala'yı kullanmak için "\\ ServerB \ C $ \ Programs \ temp \ test.txt" gibi bir UNC yolu kullanmanız gerekecek

Yanıtlar:


97

Dosyaları sistemler arasında kopyalamak için yönetim paylaşımlarını kullanmanız yeterlidir. Böylesi çok daha kolay.

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

Yerel dosya sistemi yolları yerine UNC yollarını kullanarak, komut dosyanızın bu UNC yollarına erişimi olan herhangi bir istemci sisteminden yürütülebilir olmasını sağlamaya yardımcı olursunuz. Yerel dosya sistemi yollarını kullanırsanız, o zaman betiği belirli bir bilgisayarda çalıştırmaya zorluyorsunuz demektir.

Bu, yalnızca bir PowerShell oturumu, her iki yönetimsel paylaşım için haklara sahip olan kullanıcı altında çalıştığında çalışır.

Herkese salt okunur erişime sahip B sunucusunda normal ağ paylaşımını kullanmanızı ve yalnızca şunu aramanızı öneririm (Sunucu A'dan)

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

9
Bu yaklaşımla ilgili olası bir sorun, Copy-Item'ın alternatif kimlik bilgilerini desteklememesidir (komutu farklı bir kullanıcıyla çalıştırmanız gerekiyorsa). Bu durumda, New-PSDrive yaklaşımı gereklidir.
Ürdün

1
Bu çözüm yalnızca ana bilgisayarlar arasında UNC paylaşımlarını engelleyen bir güvenlik duvarı yoksa işe yarar. Bu durumda doğru çözüm aşağıdadır ( Copy-Item -FromSession).
Marc

88

Gönderen PowerShell sürüm 5 ve sonrası (Windows Server 2016, dahil önceki sürümleri için WMF 5 parçası olarak indirilebilir ), bu Remoting ile mümkündür. Bunun yararı, her ne sebeple olursa olsun, paylaşımlara erişemeseniz bile çalışmasıdır.

Bunun çalışması için, kopyalamanın başlatıldığı yerel oturumda PowerShell 5 veya üzeri yüklü olmalıdır. Uzak oturum gelmez değil PowerShell 5 yüklü olması gerekir - bu PowerShell sürümleri düşük olarak 2 olarak ve Windows Server sürümleri düşük olarak 2008 olarak R2 ile çalışır. [1]

A sunucusundan, B sunucusuna bir oturum oluşturun:

$b = New-PSSession B

Ve sonra, hala A'dan:

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

Öğelerin B'ye kopyalanması ile yapılır -ToSession. Her iki durumda da yerel yolların kullanıldığını unutmayın; hangi sunucuda olduğunuzu takip etmelisiniz.


[1]: yalnızca PowerShell 2'ye sahip bir uzak sunucudan veya uzak bir sunucudan kopyalama yaparken , PowerShell 5.1'deki bu hataya dikkat edin; bu , yazma sırasında özyinelemeli dosya kopyalamanın çalışmadığı anlamına gelir -ToSession, görünüşe göre kopyalama çalışmaz hepsi ile -FromSession.


3
Her iki sunucuda da PS 5'in kurulu olmasının gerekli olmadığını anladım. Yalnızca kaynak sunucunun (Windows 10) PS 5'in yüklü olduğu başarılı bir test gerçekleştirdim. Hedef, varsayılan PS yüklü Windows Server 2012 R2 idi ($ PSVersionTable.PSVersion raporları 4).
Taylor Buchanan

2
Kaynakta -ToSession kullanırsanız, yalnızca kaynağa PS 5'in yüklenmesi gerekir. Hedefte -FromSession kullanırsanız, yalnızca hedefin PS 5'in yüklü olması gerekir.
Taylor Buchanan

1
Bu aynı zamanda yalnızca Hypervisor kurulu olduğunda (sunucu olmadan) çalışır, paylaşımları kurmanıza gerek yoktur, sadece oturumları kullanın!
2016

Teşekkür ederim! Benzer Güzel, zarif çözüm, scpüzerinde sshLinux üzerinde ... gerek sinir bozucu hisseleri ile rahatsız etmek!
Tobias J

40

Yeni bir sürücü oluşturmak için net useveya kullanın New-PSDrive:

Yeni-PsDrive: yalnızca PowerShell ortamında görülebilen yeni bir PsDrive oluşturun:

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

Net kullanım: İşletim sisteminin tüm bölümlerinde görülebilen yeni bir sürücü oluşturun.

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

Bunu iki kez çalıştırırsam New-PSDrive : A specified logon session does not exist. It may already have been terminated-> Sanırım önceki bir oturum hala devam ediyor -> Bu yüzden kullanmaya çalıştım Remove-PSDrive-> hala çalışmıyor. Ayrıca net use <driveLetter> /deleteyardımcı olmadı. Yapabileceğim başka bir şey var, böylece bu komutu bir yazılım yapısı yapılandırmasında çalıştırabilir miyim?
Bruno Bieri

Sahip New-PSDriveolmanız gereken iki kez A drive with the name 'Y' already exists.
koşmanın bir anlamı

İki kez çalıştırmanın bir anlamı olmadığına katılıyorum. Ancak bir derleme adımına dahil edilir ve yapı günde birkaç kez çalışır. Bu yüzden benim yaklaşımım, ihtiyacım olan işi yaptıktan sonra sürücüyü çıkarmaktı ve yeni bir yapı uygulaması gerçekleştiğinde onu yeniden oluşturmanın sorun olmayacağını varsayıyordum. Ama yine de bir sorun gibi görünüyor. Başka bir ipucu var mı?
Bruno Bieri

Montajdan önce monte edilip edilmediğini test etmeye ne dersiniz? veya bu yolu kullanan tüm tutamaçların kapalı olduğundan emin olduğunuzda komut dosyanızda Remove-PSDrive'ı kullanabilirsiniz.
JPBlanc

16

Sadece uzak dosyanın erişim için kimlik bilgilerinize ihtiyacı olması durumunda, "Dosyayı Uzaktan Kopyalamak" için cmdlet New-Object kullanarak bir System.Net.WebClient nesnesi oluşturabilirsiniz.

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

Veya bir dosya yüklemeniz gerekiyorsa, UploadFile'ı kullanabilirsiniz:

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

$WebClient.UploadFile($Dest, $Source)

1
@klm_ Ne demek istediğinizi açıklar mısınız?
FastTrack

0

Yukarıdaki cevapların hiçbiri benim için işe yaramadı. Bu hatayı almaya devam ettim:

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

Yani bu benim için yaptı:

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

Sonra ana bilgisayarımdan Çalıştır kutusundaki makinemden şunu yaptım:

\\{IP address of nanoserver}\C$

1
Muhtemelen paylaşım + dosya sistemi izinleriyle ilgili sorunlarla karşılaştınız. En kısıtlayıcı izinlerin kazandığını unutmayın, bu nedenle NTFS dosya sistemi katmanına erişiminiz olsa bile, paylaşım izinleri sizi kısıtlarsa, o zaman yazamazsınız. :)
Trevor Sullivan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.