2014-04-16 3 views
5

चलाने के लिए पावरहेल का उपयोग करें, तो पहले पोस्ट तो कृपया मुझे चोट न दें। मैंने चारों ओर खोज की है लेकिन मुझे जो चाहिए वह करने का कोई तरीका नहीं दिख रहा है। मैंने एक स्क्रिप्ट बनाई है जो एक फ़ोल्डर की प्रतिलिपि बनाता है जो मेरे पास कई कंप्यूटरों पर \ $ कंप्यूटर \ c $ पर है। इन फ़ोल्डरों में एक बैच फ़ाइल है जो एक .exe चलाती है। मैं क्या करना चाहता हूं कि पावरहेल उसी कंप्यूटर.txt से खींचता है जिसे मैं फ़ोल्डर की प्रतिलिपि बनाने के लिए उपयोग करता था और फिर बैच फ़ाइल चलाने के लिए psexec का उपयोग करता था। मैं यह सब मैन्युअल रूप से कर सकता था लेकिन स्क्रिप्टिंग यह एक समस्या प्रतीत होता है, यहां मैंने जो सोचा था वह काम करेगा लेकिन स्पष्ट रूप से नहीं।Psexec कमांड

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
if (test-Connection -Cn $computer -quiet) { 
    cd C:\pstools 
    psexec \\%computer cmd 
    C:\Folder\install.bat" 
} else { 
    "$computer is not online" 
} 

}

+0

क्या वास्तविक लिपि कॉपी और चिपकाया गया है? या फिर कुछ टाइपो के साथ संभवतः फिर से टाइप किया गया? – TheMadTechnician

+0

मैं इसे कॉपी/पेस्ट करता हूं। मैं पावरहेल में स्क्रिप्टिंग के साथ बहुत नौसिखिया हूं, क्षमा करें अगर वाक्यविन्यास खराब हो गया है। – noz3r0

+0

शक्तियों के साथ psexec का उपयोग न करने का प्रयास करें, मुझे इस पर बहुत सारे मुद्दे मिल गए हैं ... –

उत्तर

8

ठीक है, चलो इसे ऊपर से ले जाएं।

$computers = gc "C:\scripts\computers.txt" 

चर $computers में "computers.txt" फ़ाइल की सामग्री को लोड करता है। काफी सरल, कोई समस्या नहीं है।

अगला हमारे पास फॉरएच लूप है। यह $computers की सामग्री को विभाजित करता है और घुमावदार ब्रेसिज़ के भीतर सभी कोड के विरुद्ध $computer के रूप में प्रत्येक पंक्ति (संभावित रूप से कंप्यूटर का नाम) को संसाधित करता है।

foreach ($computer in $computers) { 

वह लूप एक मानक if-Then कथन के साथ शुरू होता है। यदि (condition) तो {do stuff}। इस मामले में यह देखने के लिए परीक्षण किया जा रहा है कि $computer नेटवर्क पर उपलब्ध है या नहीं। यदि ऐसा है, तो यह उस पर PSExec चलाने का प्रयास करता है। यदि यह ऑनलाइन नहीं है तो यह एल्से क्लॉज चलाता है, हम इसे दूसरे में प्राप्त करेंगे।

if (test-Connection -Cn $computer -quiet) { 

फिर यह निर्देशिका बदलता है। व्यर्थ की तरह, लेकिन ठीक है, जो भी हो। आप इसे स्पष्ट रूप से बुला सकते थे, जैसे कि C:\PSTools\PSExec.exe <arguments> और एक पंक्ति सहेजी, लेकिन वास्तव में कोई नुकसान नहीं हुआ है।

cd C:\pstools 

फिर आप पीएसईएक्सईक को बुला रहे हैं, हालांकि यहां थोड़ी सी वाक्यविन्यास त्रुटि है। यह $computer होना चाहिए और %computer नहीं होना चाहिए। साथ ही, इसमें केवल वह आदेश होना चाहिए जिसे आप निष्पादित करना चाहते हैं, cmd और दूसरी पंक्ति पर कमांड नहीं होना चाहिए। यदि आप शक्ति ऑपरेटर को यह समझने के लिए कॉल ऑपरेटर (&) का उपयोग करते हैं तो बेहतर परिणाम हो सकते हैं कि यह कुछ निष्पादित करने की कोशिश कर रहा है और cmdlet या फ़ंक्शन नहीं चला रहा है या नहीं।

& psexec \\$computer C:\Folder\install.bat 

उसके बाद वरना खंड है कि अगर कंप्यूटर नहीं स्ट्रिंग लिखने के लिए ऑनलाइन "$ कंप्यूटर है ऑनलाइन नहीं" बाकी खंड और foreach पाश के लिए ब्रेसिज़ बंद करने के बाद है कहते है।

} else { 
    "$computer is not online" 
} 


} 

संपादित करें: ठीक है, अपने तैयार स्क्रिप्ट कुछ इस तरह (संलग्न लक्ष्य उद्धरण में मामले में पथ में स्थान नहीं) दिखना चाहिए:

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
    if (test-Connection -Cn $computer -quiet) { 
     & C:\pstools\psexec.exe \\$computer "C:\folder\install.bat" 
    } else { 
     "$computer is not online" 
    } 
} 
+0

ठीक है, मैं देखता हूं कि मैं इसे थोड़ा सा कैसे कम कर सकता हूं। पूर्ण ब्रेक डाउन के लिए धन्यवाद। मेरी समस्या यह है कि मैं Psexec फ़ंक्शन को सही तरीके से काम नहीं कर सकता और मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं। अगर मैं इसे मैन्युअल रूप से कर रहा था तो मैं कमांड प्रॉम्प्ट खोलूंगा और 'psexec \\ होस्टनाम cmd' टाइप करूंगा, तो मैं उस मशीन कमांड प्रॉम्प्ट में होगा, जिससे मैं केवल उस फ़ोल्डर में नेविगेट कर सकता हूं जिसे मैं चाहता हूं और बैच फ़ाइल चलाऊं । – noz3r0

+0

क्या आप वाकई असफल हो रहे हैं? PSExec एक त्रुटि फेंक देगा यदि आप इसे PowerShell ISE में चलाते हैं, और अभी भी कार्य करते हैं। इसके लिए एक कारण है, और इसे पीएसईएक्सईसी डेटा को आउटपुट करने के साथ करना है, और इसमें से कुछ मानक आउटपुट स्ट्रीम के लिए आउटपुट है, और इसमें से कुछ त्रुटि स्ट्रीम में आउटपुट है। भले ही, क्या आप वाकई काम नहीं कर रहे हैं? – TheMadTechnician

+0

मुझे लगता है कि आपने वहां एक संपादन को फेंक दिया है, मेरी अंतिम लिपि आपके जैसा नहीं थी, मैं इसे सुबह में जाने दूंगा और आपको बता दूंगा। ऐसा लगता है जैसे इसे काम करना चाहिए। आपकी परिश्रम के लिए धन्यवाद। – noz3r0

1

इस आज़मा कर देखें। आपके पास % था जहां आप $ चाहते थे। Cmd.exe कॉल भी अनावश्यक है।

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
if (test-Connection -Cn $computer -quiet) { 
    cd C:\pstools 
    psexec \\$computer "C:\Folder\install.bat" 
} else { 
    "$computer is not online" 
} 

} 
+0

झूठा अलार्म। यह इस तरह पेक्सैक नहीं चलाएगा, यह एक वैध cmdlet नहीं कहता है। निष्पादन योग्य चलाने के लिए कोई आदेश है? – noz3r0

0

उपयोग & (कॉल) ऑपरेटर, & psexec \ $ कंप्यूटर "सी: \ फ़ोल्डर \ स्थापित करें।बल्ला "

4

मुझे पता है इस सवाल का 2014 से है, और इस सवाल का जवाब सीधे प्रश्न उपयोगकर्ता पूछा का समाधान नहीं होगा। लेकिन लोग हैं, जो इन दिनों इस सवाल के पार चलो के लिए, मुझे पता है कि तुम नहीं फेंक करना चाहते हैं जरूरत है * यदि आप PowerShell का उपयोग कर रहे PSExec उपयोग करने के लिए। जब ​​से तुम PowerShell में पहले से ही कर रहे हैं, बस Invoke-Command का उपयोग करें।

सिंटेक्स

Invoke-Command -ComputerName $Computer -ScriptBlock { C:\Folder\install.bat } 

होगा यह वास्तव में बहुत आसान है।

* लक्ष्य सर्वर पर सक्षम होने के लिए PowerShell remoting की आवश्यकता है।

+1

यह एक सकल ओवर-सरलीकरण है। अगर install.bat को डबल-हॉप की आवश्यकता है, तो यह काम नहीं करेगा। –