PowerShell के साथ दूरस्थ रूप से फ़ाइल की प्रतिलिपि बनाएँ


93

मैं एक PowerShell स्क्रिप्ट लिख रहा हूं जिसे मैं सर्वर ए से चलाना चाहता हूं। मैं सर्वर बी से कनेक्ट करना चाहता हूं और बैकअप के रूप में सर्वर ए पर एक फाइल कॉपी करना चाहता हूं।

यदि ऐसा नहीं किया जा सकता है, तो मैं सर्वर ए से सर्वर बी से कनेक्ट करना चाहूंगा और सर्वर बी में किसी अन्य निर्देशिका में एक फाइल कॉपी कर सकता हूं।

मैं 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
कॉपी-आइटम का उपयोग करने के लिए आपको "\\ ServerB \ C $ \ Programs \ temp \ test.txt" जैसे UNC पथ का उपयोग करना होगा

जवाबों:


94

सिस्टम के बीच फ़ाइलों को कॉपी करने के लिए बस प्रशासनिक शेयरों का उपयोग करें। यह इस तरह से बहुत आसान है।

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

स्थानीय फ़ाइल सिस्टम पथों के बजाय UNC पथों का उपयोग करके, आप यह सुनिश्चित करने में सहायता करते हैं कि आपकी स्क्रिप्ट किसी भी क्लाइंट सिस्टम से उन UNC पथों तक पहुँच के साथ निष्पादन योग्य है। यदि आप स्थानीय फाइलसिस्टम रास्तों का उपयोग करते हैं, तो आप एक विशिष्ट कंप्यूटर पर स्क्रिप्ट को चलाने में अपने आप को मथ रहे हैं।

यह तभी काम करता है जब PowerShell सत्र उस उपयोगकर्ता के अंतर्गत चलता है जिसके पास दोनों प्रशासनिक शेयरों के अधिकार हैं।

मेरा सुझाव है कि सभी के लिए केवल पढ़ने के लिए और केवल (सर्वर ए से) कॉल के साथ सर्वर बी पर नियमित नेटवर्क शेयर का उपयोग करें:

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

9
इस दृष्टिकोण के साथ एक संभावित मुद्दा यह है कि कॉपी-आइटम वैकल्पिक क्रेडेंशियल का समर्थन नहीं करता है (यदि आपको एक अलग उपयोगकर्ता के साथ कमांड चलाना है)। उस स्थिति में, नए-PSDrive दृष्टिकोण की आवश्यकता है।
जॉर्डन

1
यह समाधान केवल तभी काम करता है जब UNC शेयरों को अवरुद्ध करने वाले मेजबानों के बीच कोई फ़ायरवॉल न हो। उस स्थिति में सही समाधान नीचे है ( Copy-Item -FromSession)।
मार्क

85

से PowerShell संस्करण 5 के बाद (विंडोज सर्वर 2016 में शामिल किए गए पुराने संस्करणों के लिए WMF 5 के भाग के रूप में डाउनलोड ), इस दूरस्थ बनाने के साथ संभव है। इसका लाभ यह है कि यह काम करता है भले ही, किसी भी कारण से, आप शेयरों तक नहीं पहुंच सकते।

इस काम के लिए, स्थानीय सत्र जहां नकल शुरू की गई है, उसमें PowerShell 5 या उच्चतर स्थापित होना चाहिए। दूरस्थ सत्र को PowerShell 5 को स्थापित करने की आवश्यकता नहीं है - यह PowerShell संस्करणों के साथ कम से कम 2, और Windows Server संस्करणों के साथ कम से कम 2008 R2 तक काम करता है। [1]

सर्वर A से, सर्वर B के लिए एक सत्र बनाएँ:

$b = New-PSSession B

और फिर, अभी भी ए से:

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

आइटम को B से कॉपी करने के साथ किया जाता है -ToSession। ध्यान दें कि स्थानीय पथ दोनों मामलों में उपयोग किए जाते हैं; आपको इस बात का ध्यान रखना होगा कि आप किस सर्वर पर हैं।


[१]: जब किसी पावर सर्वर २ से कॉपी किया जाता है या उसके पास होता है , जिसमें पावरशेल ५.१ में इस बग से सावधान रहना चाहिए , जो लिखने के समय का मतलब है कि पुनरावर्ती फ़ाइल की नकल के साथ काम नहीं करता है -ToSession, एक जाहिरा तौर पर नकल पर काम नहीं करता है सभी के साथ -FromSession


3
मैंने पाया है कि दोनों सर्वरों के लिए PS 5 स्थापित होना आवश्यक नहीं है। मैंने अभी एक सफल परीक्षण किया जहां केवल स्रोत सर्वर (विंडोज 10) में पीएस 5 स्थापित था। लक्ष्य डिफ़ॉल्ट सर्वर स्थापित ($ PSVersionTable.PSVersion रिपोर्ट 4) के साथ विंडोज सर्वर 2012 R2 था।
टेलर बुकानन

2
यदि आप स्रोत पर -ToSession का उपयोग करते हैं, तो केवल स्रोत को PS 5 स्थापित करने की आवश्यकता है। यदि आप लक्ष्य पर -FromSession का उपयोग करते हैं, तो केवल लक्ष्य PS 5 स्थापित होना चाहिए।
टेलर बुकानन

1
यह तब भी काम करता है जब आपके पास केवल हाइपरवाइज़र (सर्वर के बिना) स्थापित होता है, केवल सत्रों का उपयोग करने के लिए शेयर सेट करने की आवश्यकता नहीं होती है!
डैशसी

धन्यवाद! अच्छा, सुरुचिपूर्ण समाधान, लिनक्स पर scpखत्म sshहोने के समान ... pesky शेयरों के साथ परेशान करने की कोई ज़रूरत नहीं है!
तोबियस जे

40

उपयोग net useया New-PSDriveएक नई ड्राइव बनाने के लिए:

नई PsDrive: एक नया PsDrive बनाएं जो केवल PowerShell वातावरण में दिखाई दे:

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

अगर मैं इसे दो बार चलाता हूं तो मुझे New-PSDrive : A specified logon session does not exist. It may already have been terminatedलगता है -> मुझे लगता है कि एक पिछला सत्र अभी भी चल रहा है -> इसलिए मैंने उपयोग करने की कोशिश की Remove-PSDrive-> फिर भी यह काम नहीं करता है। भी net use <driveLetter> /deleteमदद नहीं की। किसी भी अन्य चीज़ को मैं कर सकता हूँ इसलिए मैं इस कमांड को सॉफ्टवेयर बिल्ड कॉन्फ़िगरेशन में चलाने में सक्षम हूँ?
ब्रूनो बीरी

New-PSDriveआपके पास दो बार चलाने का कोई मतलब नहीं हैA drive with the name 'Y' already exists.
JPBlanc

मैं मानता हूं कि इसे दो बार चलाने का कोई मतलब नहीं है। लेकिन यह एक बिल्ड स्टेप में शामिल है और बिल्ड दिन में कई बार चलता है। इसलिए मेरा दृष्टिकोण था कि एक बार जब मुझे जो काम चाहिए, मैं ड्राइव को हटा दूं और मैं यह मान रहा था कि एक नया बिल्ड निष्पादन होने के बाद इसे दोबारा बनाने के लिए कोई समस्या नहीं होगी। लेकिन यह एक समस्या लगती है। कोई और संकेत?
ब्रूनो बिएरी

यदि इसे माउंट करने से पहले माउंट किया जाता है तो परीक्षण के बारे में क्या? या आप अपनी स्क्रिप्ट में Remove-PSDrive का उपयोग कर सकते हैं जब आप सुनिश्चित हों कि इस पथ का उपयोग करने वाले सभी हैंडल बंद हैं।
JPBlanc

16

बस उस स्थिति में जब रिमोट फ़ाइल को एक्सेस करने के लिए आपकी क्रेडेंशियल की आवश्यकता होती है, आप एक सिस्टम.नेट उत्पन्न कर सकते हैं। ऐसा करने के लिए cmdlet न्यू- ऑब्जेक्ट का उपयोग करके " ऑब्जेक्ट को दूरस्थ रूप से कॉपी करें" जैसे नए ऑब्जेक्ट उत्पन्न कर सकते हैं।

$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
@ चक_ क्या आप समझा सकते हैं कि आपका क्या मतलब है?
फास्टट्रैक

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 फाइलसिस्टम परत पर पहुंच है, तो यदि शेयर अनुमतियाँ आपको प्रतिबंधित करती हैं, तो आप नहीं लिख पाएंगे। :)
ट्रेवर सुलिवन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.