Powershell से एक त्रुटि लॉग जनरेट करें


0

मैंने CSV फ़ाइल के अंदर एक सूची के आधार पर एक व्यापक फ़ोल्डर संरचना के अंदर बड़े पैमाने पर संपादन अनुमतियों में सहायता के लिए एक स्क्रिप्ट बनाई। स्क्रिप्ट अपेक्षा के अनुसार काम करती है, लेकिन कई फ़ोल्डरों के लिए, मुझे पता है कि स्क्रिप्ट को विफल होना चाहिए और एक त्रुटि फेंकनी चाहिए क्योंकि फ़ोल्डर मौजूद नहीं है। हालाँकि, मुझे स्क्रिप्ट से कोई आउटपुट नहीं मिल रहा है, एक चल रही सूची से अलग मुझे वर्तमान फ़ोल्डर के बारे में सूचित करना होगा। मैंने कोशिश-कैच का प्रयास किया है, लेकिन स्क्रिप्ट पहली त्रुटि पर प्रसंस्करण बंद कर देती है और मुझे यकीन नहीं है कि स्क्रिप्ट को चालू रखने के लिए इंजीनियर कैच कैसे करें। स्क्रिप्ट प्रोसेसिंग को रखने का सबसे अच्छा तरीका क्या है, लेकिन मुझे पता है कि आउटपुट त्रुटियां एक फ़ाइल के लिए मौजूद हैं इसलिए मैं बाद में उनकी समीक्षा कर सकता हूं?

उदाहरण के लिए, जब कोड चलता है, तो उसे 1-3 पर काम करना चाहिए। यदि फ़ोल्डर 2 मौजूद नहीं है, तो पॉवर्सशेल उस पथ के साथ एक त्रुटि फेंकने के लिए उपयोग करता है जो इसे नहीं मिल सकता है और जारी रहेगा। मैं उस त्रुटि को बाद में पार्स करने के लिए एक फ़ाइल में चाहूंगा क्योंकि कुछ फ़ोल्डर्स इस स्क्रिप्ट द्वारा संशोधित संरचना का पालन नहीं करते हैं।

$CSV=Import-Csv "C:\ProjectList.csv"

ForEach ($Entry in $CSV)

{

$ProjectNumber = $Entry.Projects
$Project = "$ProjectMain\$ProjectNumber"

Write-Host $Project  #Writes out current project being processed

#sddl defines

$sddlProject = 'D:PAI(D;CI;DCLCSDWDWO;;;DU)(D;CI;DCLCSDWDWO;;;S-1-5-21-513)(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;FA;;;DA)(A;OICI;0x1200a9;;;DU)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;0x1200a9;;;S-1-5-21-513)'

$sddlRootFolders = 'D:PAI(D;;SDWDWO;;;DU)(D;;SDWDWO;;;S-1-5-21-513)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;DU)(A;OICI;FA;;;BA)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;0x1301bf;;;S-1-5-21-513)'

$sddlCommon = 'D:AI(A;ID;FA;;;BA)(A;OICIIOID;FA;;;CO)(A;OICIID;FA;;;SY)(A;OICIID;FA;;;DA)(A;OICIID;0x1301bf;;;DU)(A;OICIIOID;FA;;;BA)(A;OICIID;FA;;;S-1-5-21-512)(A;OICIID;0x1301bf;;;S-1-5-21-513)'

$sddlMGMT = 'D:PAI(A;OICI;0x1301bf;;;S-1-5-21-1501)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12461)(A;OICI;0x1301bf;;;S-1-5-21-12462)(A;OICI;0x1301bf;;;S-1-5-21-12463)(A;OICI;0x1301bf;;;S-1-5-21-12464)(A;OICI;0x1301bf;;;S-1-5-21-12465)(A;OICI;0x1301bf;;;S-1-5-21-12466)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1486)(A;OICI;0x1301bf;;;S-1-5-21-1487)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'


$sddlFiles = 'D:AI(A;ID;FA;;;BA)(A;ID;FA;;;SY)(A;ID;FA;;;DA)(A;ID;0x1301bf;;;DU)(A;ID;FA;;;S-1-5-21-512)(A;ID;0x1301bf;;;S-1-5-21-513)'


#Apply ACL to main folder

$securityDescriptor = Get-Acl -Path $Project
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlProject)
Set-Acl -Path $Project -AclObject $securityDescriptor 


#Apply ACL to the top tier folders

$ProjectSub = $Project + "\Folder1"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

$ProjectSub = $Project + "\Folder2"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

$ProjectSub = $Project + "\Folder3"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

#Apply ACL to MGMT folders

$ProjectSub = $Project + "\Folder9"

$ProjectDiscSub = $ProjectSub + "\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub 
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMT)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

#Apply ACL to MGMT inside folders

$ProjectDiscSub = $Project + "\Folder1\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub
$sddlMGMTSub = 'D:PAI(D;;SDWDWO;;;S-1-5-21-12471)(D;;SDWDWO;;;S-1-5-21-1497)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12471)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1497)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMTSub)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

$ProjectDiscSub = $Project + "\Folder3\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub
$sddlMGMTSub = 'D:PAI(D;;SDWDWO;;;S-1-5-21-12469)(D;;SDWDWO;;;S-1-5-21-1501)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12469)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1501)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMTSub)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

}

जवाबों:


1

उस तरह की त्रुटियों से निपटने के लिए कई रणनीतियाँ हैं।

पहला -ErrorActionआदेश में एक पैरामीटर जोड़ना है जो विफल हो सकता है।

दूसरा प्रयास / पकड़ में कमांड लपेटना है:

$ProjectSub = $Project + "\Folder2"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
try {
    Set-Acl -Path $ProjectSub -AclObject $securityDescriptor
} catch {
    "Poo"
}
"Do more"

ध्यान दें कि दोनों मामलों में, आपको अभी भी मानक त्रुटि संदेश मिलते हैं, लेकिन वह निष्पादन जारी रहता है। पूर्व मामले में, निष्पादन अगली पंक्ति में जाता है। कोशिश / कैच में, कैच को निष्पादित किया जाता है (प्रिंट "पू") फिर अगली पंक्ति ("डू मोर")। यदि आप केवल असफलता पर ही कुछ करना चाहते हैं, तो आपको वास्तव में कोशिश / पकड़ की आवश्यकता है जैसे बाद के प्रसंस्करण के लिए एक अलग फाइल में कुछ विवरणों को सहेजना।

आपके मामले में, यह मानते हुए कि प्रसंस्करण सूची बहुत बड़ी नहीं है, आप गैर-मौजूद फ़ाइल विवरण को एक चर में जमा करने के लिए पकड़ में एक कस्टम ऑब्जेक्ट बना सकते हैं। फिर स्क्रिप्ट के अंत में, चर को किसी फ़ाइल में लिखें। बस चर बहुत बड़ा हो रहा है के लिए बाहर देखो। मेरे पास 10 के हजारों परिणामों के साथ स्क्रिप्ट है जो बड़ी मात्रा में मेमोरी का उपयोग करते हैं!


मैं उस के बारे में सोचता हूं, लेकिन प्रसंस्करण सूची बड़ी है। दिखाई गई स्क्रिप्ट को पढ़ने में आसानी के लिए बहुत कटौती की गई है और जब मैंने इसे एक संरचना पर चलाया, तो यह 50 मिनट तक चला। मैं सिर्फ त्रुटि डंप और आगे बढ़ने की जरूरत है। -ErrorAction आगे बढ़ता है, लेकिन यह मेरे लिए एक फ़ाइल में त्रुटि को बाहर नहीं निकालता है।
मैक्रॉन

आह, बाधित हो गया और 5 मिनट का टाइमर मुझे मिल गया। जब मैंने ट्राई / कैच किया, तो मैं इसे केवल कमांड से अधिक पर करने की कोशिश कर रहा था। मैं कोशिश करूँगा कि प्रत्येक कमांड पर स्वयं और यह एक फ़ाइल में जोड़ें और देखें कि क्या मुझे वह मिलता है जिसकी मुझे आवश्यकता है।
मेक्रॉन

मैं वोट नहीं दे सकता क्योंकि मेरे पास अभी तक प्रतिष्ठा नहीं है, लेकिन धन्यवाद कहना चाहता हूं, जूलियन। कोशिश / पकड़ो पालतू कमान काम करता है। मेरे पास पथ को आउटपुट करने में विफलता है, इसलिए त्रुटि फ़ाइल विफल परियोजनाओं और / या फ़ोल्डरों के पथ के साथ भरती है, जो मेरे द्वारा उपयोग किए जाने वाले चर पर निर्भर करता है। यह पर्याप्त है कि मुझे क्या चाहिए।
मेक्रॉन

कोई समस्या नहीं @Meckron, मुझे लगता है कि आपको इसे सही उत्तर के रूप में कल स्वीकार करना चाहिए (मुझे लगता है कि आपको 24 घंटे इंतजार करना होगा?) इससे मुझे कुछ अतिरिक्त बिंदु भी मिलेंगे, हमेशा स्वागत है :)
जूलियन नाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.