2011-08-22 16 views
7

के पहले तत्व के रूप में अनुमति दी गई है, मैं पावरहेल में लिखित में नया हूं लेकिन यह वही है जो मैं पूरा करने की कोशिश कर रहा हूं।अभिव्यक्तियों को केवल पाइपलाइन

  1. मैं अगर एक अन्य की तुलना में नया है निर्धारित करने के लिए दो Excel फ़ाइलों की तारीखों की तुलना करना चाहते।
  2. मैं एक कंप्यूटर पर csv से xls तक एक फ़ाइल को कनवर्ट करना चाहता हूं जिसमें एक्सेल नहीं है। केवल अगर उपरोक्त कथन सत्य है, तो प्रारंभिक xls फ़ाइल पहले ही कॉपी की गई थी।
  3. मैं नई परिवर्तित xls फ़ाइल को किसी अन्य स्थान पर कॉपी करना चाहता हूं
  4. यदि फ़ाइल पहले से ही खुली है तो यह प्रतिलिपि में विफल हो जाएगी, इसलिए मैं इस ऑपरेशन की सफलता या विफलता पर एक ईमेल अलर्ट भेजना चाहता हूं।

यहां वह स्क्रिप्ट है जिसमें मुझे समस्याएं हैं। त्रुटि यह है कि "अभिव्यक्तियों को केवल पाइपलाइन के पहले तत्व के रूप में अनुमति दी जाती है।" मुझे पता है कि यह ईमेल ऑपरेशन के साथ करना है, लेकिन मुझे नुकसान है कि इसे उन सभी चर के साथ मैन्युअल रूप से कैसे लिखना है। शायद अधिक त्रुटियां हैं लेकिन मैं अब उन्हें नहीं देख रहा हूं। किसी भी मदद के लिए धन्यवाद, मैं इसकी सराहना करता हूं!

$CSV = "C:filename.csv" 
$LocalXLS = "C:\filename.xls" 
$RemoteXLS = "D:\filename.xls" 
$LocalDate = (Get-Item $LocalXLS).LASTWRITETIME 
$RemoteDate = (Get-Item $RemoteXLS).LASTWRITETIME 
$convert = "D:\CSV Converter\csvcnv.exe" 
if ($LocalDate -eq $RemoteDate) {break} 
else { 
& $convert $CSV $LocalXLS 
$FromAddress = "[email protected]" 
$ToAddress = "[email protected]" 
$MessageSubject = "vague subject" 
$SendingServer = "mail.mail.com" 
$SMTPMessage = New-Object System.Net.Mail.MailMessage $FromAddress, $ToAddress, $MessageSubject, $MessageBody 
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer 
$SendEmailSuccess = $MessageBody = "The copy completed successfully!" | New-Object System.Net.Mail.SMTPClient mail.mail.com $SMTPMessage 
$RenamedXLS = {$_.BaseName+(Get-Date -f yyyy-MM-dd)+$_.Extension} 

Rename-Item -path $RemoteXLS -newname $RenamedXLS -force -erroraction silentlycontinue 
If (!$error) 
    { $SendEmailSuccess | copy-item $LocalXLS -destination $RemoteXLS -force } 
Else 
    {$MessageBody = "The copy failed, please make sure the file is closed." | $SMTPClient.Send($SMTPMessage)} 
} 
+2

मैं वास्तव में क्या यकीन नहीं है आप इस लाइन पर पूरा करने की कोशिश कर रहे हैं: $ SendEmailSuccess = $ MessageBody = "प्रति सफलतापूर्वक पूर्ण हो गई!" | न्यू ऑब्जेक्ट सिस्टम.Net.Mail.SMTPClient mail.mail.com $ SMTPMessage लेकिन मुझे लगता है कि यह त्रुटि का अपराधी है। – EBGreen

+1

@meep - सामग्री को संपादित न करें। तब भी आपका प्रश्न रखने में कोई बात नहीं है। भविष्य के आगंतुकों के लिए यह उपयोगी होगा भले ही आपने इसे समझ लिया हो। अपने संपादन संलग्न करें। – manojlds

उत्तर

4

यह त्रुटि मूल रूप से होता है जब आप पाइपलाइन की प्राप्ति ओर एक अभिव्यक्ति का उपयोग जब यह पाइप लाइन से वस्तुओं को प्राप्त नहीं कर सकते हैं।

आप त्रुटि मिलती है अगर आप कुछ इस तरह करना होगा:

$a="test" | $a 

या यहाँ तक कि इस:

"test" | $a 

मैं नहीं जानता कि क्यों हर जगह पाइप करने की कोशिश कर रहे हैं। मैं आपको पावरहेल पाइपलाइनिंग के बारे में मूल बातें सीखने की सलाह दूंगा। आप इसे गलत कर रहे हैं। इसके अलावा, मुझे लगता है कि आप इस लिंक का उल्लेख कर सकते नीचे कैसे मेल भेजने के लिए देखने के लिए, जटिलताओं है कि आप पाइप के साथ जोड़ लिया है बिना सीधे आगे होना चाहिए: http://www.searchmarked.com/windows/how-to-send-an-email-using-a-windows-powershell-script.php

+2

मुझे पाइप पसंद है, लेकिन मुझे लगता है कि इसे इस्तेमाल किया जा रहा है। विशेष रूप से स्क्रिप्ट के अंदर। मैं कमांड प्रॉम्प्ट पर हर समय पाइप का उपयोग करता हूं, लेकिन मैं इसे शायद ही कभी एक स्क्रिप्ट में उपयोग करता हूं। – EBGreen

+2

@EBGreen - मुझे लगता है कि वास्तविक समस्या केवल तब होती है जब आप वास्तव में नहीं समझते कि क्या हो रहा है। उदाहरण के लिए, आप '$ a | का उपयोग कर सकते हैं 'लिखने-होस्ट' ए 'लिखने के बजाय' लिखने-होस्ट '। और हाँ, कभी-कभी यह अधिक उपयोग किया जाता है। एक लाइनर लिखना अच्छा लगा, लेकिन उन स्क्रिप्ट को बनाए रखना मुश्किल है जिन्हें दूसरों को पढ़ना और बनाए रखना है। – manojlds

+2

यप जब भी उन्हें एक स्क्रिप्ट में पूरी तरह से सही उपयोग किया जाता है, तो मैं इसे आगे बढ़ने और एक स्क्रिप्ट में जितना संभव हो उतना स्पष्ट बनाने के लिए अच्छी आदतों (खुद के लिए) के मामले के रूप में देखता हूं। इसका अर्थ है उपनाम के बजाय कम पाइपिंग और स्पष्ट cmdlet नाम। – EBGreen

5

आपको यह त्रुटि जब आप एक स्वतंत्र निष्पादित करने के लिए कोशिश कर रहे हैं मिलता है एक पाइपलाइन श्रृंखला के भीतर से कोड का ब्लॉक।

$("div").not(".main").console.log(this) 

प्रत्येक बिंदु (.) अगले समारोह में सरणी श्रृंखला देगा:

बस एक अलग उदाहरण के रूप में, इस कोड का उपयोग कर jQuery कल्पना। उपरोक्त फ़ंक्शन में यह console के साथ टूट जाता है क्योंकि इसका मतलब किसी भी मूल्य को पाइप करने के लिए नहीं है। अगर हम कुछ कोड निष्पादित करने के लिए हमारी श्रृंखला से तोड़ना चाहते हैं (शायद श्रृंखला में ऑब्जेक्ट्स पर - हम each के साथ ऐसा कर सकते हैं:

$("div").not(".main").each(function() {console.log(this)}) 

समाधान powershell समान है। आप व्यक्तिगत रूप से अपने श्रृंखला में प्रत्येक मद के सामने एक स्क्रिप्ट चलाने के लिए चाहते हैं, आप ForEach-Object उपयोग कर सकते हैं या इसे अन्य नाम (%) है।

कल्पना कीजिए कि आप PowerShell में निम्न कार्य हो:

$settings | ?{$_.Key -eq 'Environment' } | $_.Value = "Prod" 

अंतिम पंक्ति निष्पादित नहीं किया जा सकता क्योंकि यह एक स्क्रिप्ट है, लेकिन we can fix that with ForEach इस तरह:

$settings | ?{$_.Key -eq 'Environment' } | %{ $_.Value = "Prod" } 
संबंधित मुद्दे