2009-05-31 12 views
19

ठीक है कुछ आसान है बस मेरे लिए काम नहीं कर रहा है। मुझे एक cmdlet मिला जो एक पैरामीटर स्वीकार करता है। मैं एक विंडोज बैच फ़ाइल के भीतर एक cmdlet कॉल करने की कोशिश कर रहा हूँ। बैच फ़ाइल में शामिल हैं:विंडोज बैच फ़ाइल से कॉलिंग पावरहेल cmdlets

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell Set-ExecutionPolicy Unrestricted 
powershell 'C:\convert-utf8-to-utf16.ps1 C:\test.txt' 
powershell Set-ExecutionPolicy Restricted 
pause 

मेरे PS1 फ़ाइल को फिर से कुछ भी विशेष नहीं कर:

function convert-utf8-to-utf16 { 
    $tempfile = "C:\temp.txt" 
    set-ExecutionPolicy Unrestricted 
    get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding Unicode 
    set-ExecutionPolicy Restricted 
    } 

जब मैं बल्लेबाजी फ़ाइल निष्पादित यह सिर्फ पूरा होने (कोई त्रुटि संदेश) के लिए चलाता है और इसे करने के लिए प्रकट नहीं होता है temp.txt फ़ाइल बनाएं।

मैं पीएस कमांड प्रॉम्प्ट पर powerhell कमांड फ़ाइल चला सकता हूं लेकिन cmd में नहीं!

किसी को भी कोई विचार है कि क्या गलत हो सकता है?

धन्यवाद

+0

जोहान्स: cmd.exe एक Win32 एप्लिकेशन है (हालांकि कई लोग अभी भी इसे DOS कमांड.com के रूप में सोचते हैं)। [प्रश्न संपादित किया जाना चाहिए] – grawity

+0

इसके बारे में पूर्ण स्रोत कोड के साथ कोई अंतिम समाधान? – Kiquenet

उत्तर

0

इस वाक्य रचना के बजाय का प्रयास करें:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell {Set-ExecutionPolicy Unrestricted} 
powershell "& C:\convert-utf8-to-utf16.ps1 C:\test.txt" 
powershell {Set-ExecutionPolicy Restricted} 
pause 
1

मैं इस काम के मिल गया ... PS1 फ़ाइल एक समारोह में लपेटा करने की आवश्यकता नहीं है। बस यह घोषणा ठीक है।

$tempfile = "C:\temp.txt" 
get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding unicode  

और बल्ले फ़ाइल इसे पसंद कॉल:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell Set-ExecutionPolicy Unrestricted 
powershell "& 'C:\convert-utf8-to-utf16.ps1 C:\test.txt' 'C:\test.txt'" 
powershell Set-ExecutionPolicy Restricted 
pause 
+0

आपने जो भी भाग लिया वह यह है कि स्क्रिप्ट एक समारोह को परिभाषित कर रही थी, लेकिन इसे निष्पादित नहीं कर रही थी। आप या तो स्क्रिप्ट के अंत में फ़ंक्शन को कॉल कर सकते हैं, या फ़ंक्शन में अपना कोड लपेट नहीं सकते हैं (जैसे आप कर रहे हैं)। – JasonMArcher

5

समस्या PS1 फाइल में है - आप एक समारोह की घोषणा लेकिन आप इसे न बुलाया जाए। मैं इसे इस तरह संशोधित करूंगा:

param($path) 
function convert-utf8-to-utf16 { 
$tempfile = "C:\temp.txt" 
set-ExecutionPolicy Unrestricted 
get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding Unicode 
set-ExecutionPolicy Restricted 
} 

convert-utf8-to-utf16 $path 

यह काम करेगा। हालांकि, यह आवश्यक नहीं है, तो आप बस समारोह घोषणा ommit और स्क्रिप्ट में ही शरीर को स्थानांतरित कर सकते हैं:

param($path) 
$tempfile = "C:\temp.txt" 
set-ExecutionPolicy Unrestricted 
get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode 
set-ExecutionPolicy Restricted 
3
# Test-Args.ps1 
param($first, $second) 
write-host $first 
write-host $second 

कॉल कमांड प्रॉम्प्ट से:

PowerShell.exe -NoProfile -Command "& {./Test-Args.ps1 'C:\Folder A\One' 'C:\Folder B\Two'}" 

क्या भ्रमित है कि यदि है स्क्रिप्ट रिक्त स्थान वाले फ़ोल्डर पथ में है, पावरशेल उद्धरणों में स्क्रिप्ट नाम को नहीं पहचानता है:

PowerShell.exe -NoProfile -Command "& {'C:\Folder X\Test-Args.ps1' 'C:\Folder 
A\One' 'C:\Folder B\Two'}" 

लेकिन आप की तरह कुछ का उपयोग कर कुछ मिल सकता है:

PowerShell.exe -NoProfile -Command "& {set-location 'C:\Folder X';./Test-Args.ps1 'C:\Folder 
A\One' 'C:\Folder B\Two'}" 

अपने .PS1 फ़ाइल के नाम में रिक्त स्थान का प्रयोग न करें, या आप भाग्य से बाहर हो।

22

Powershell संस्करण 2 के साथ शुरू, आप एक PowerShell स्क्रिप्ट इतनी तरह

powershell -ExecutionPolicy RemoteSigned -File "C:\Path\Script.ps1" "Parameter with spaces" Parameter2 

अब चला सकते हैं ... अगर मैं केवल dragging and dropping files to a Powershell script को संभालने के लिए एक तरह से यह पता लगाने सकता है।

+0

आपको बहुत धन्यवाद, यह मेरे सिरदर्द को हल करता है और एनएसआईएस को पावरहेल बदलने के लिए टालता है – CharlesB

7

मैं दोनों को समझाता हूं कि आप एक बैच फ़ाइल से PowerShell स्क्रिप्ट क्यों कॉल करना चाहते हैं और इसे in my blog post here कैसे करें।

यह आप के लिए क्या देख रहे मूल रूप से है:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\convert-utf8-to-utf16.ps1' 'C:\test.txt'" 

और अगर आप एक व्यवस्थापक के रूप में अपने PowerShell स्क्रिप्ट चलाने के लिए की जरूरत है, इस का उपयोग करें:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\convert-utf8-to-utf16.ps1"" ""C:\test.txt""' -Verb RunAs}" 

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

संबंधित मुद्दे