2009-08-18 346 views
72

多年來,我使用了cmd/DOS/Windows shell,並將命令行參數傳遞給批處理文件。例如,我有一個文件,zuzu.bat並在其中,我訪問%1,%2等。現在,我想要執行相同的操作時,我會調用PowerShell腳本when I am in a Cmd.exe shell。我有一個腳本,xuxu.ps1(我已經將PS1添加到我的PATHEXT變量以及與PowerShell關聯的PS1文件)。但無論我做什麼,我似乎都無法從$args變量中獲得任何東西。它總是有長度0.如何將命令行參數傳遞給PowerShell ps1文件

如果我在PowerShell殼,而不是cmd.exe,它的工作(當然)。但是我還不夠舒適,因此無法全時在PowerShell環境中工作。我不想輸入powershell.exe -command xuxu.ps1 p1 p2 p3 p4。我想輸入xuxu p1 p2 p3 p4

這是可能的,如果是這樣,如何?

我不能去工作的樣品是微不足道的,foo.ps1:

Write-Host "Num Args:" $args.Length; 
foreach ($arg in $args) { 
    Write-Host "Arg: $arg"; 
} 

結果總是這樣:

C:\temp> foo 
Num Args: 0 
C:\temp> foo a b c d 
Num Args: 0 
c:\temp> 

回答

16

OK,所以首先這是打破一個基本的安全功能在PowerShell中。瞭解這一點,這裏是你如何能做到這一點:

  1. 打開一個Windows Explorer窗口
  2. 菜單工具 - >文件夾選項 - >標籤文件類型
  3. 找到PS1文件類型並點擊高級按鈕
  4. 點擊新按鈕
  5. 對於行動把:打開
  6. 對於應用程序的說:「C:\ WINNT \ SYSTEM32 \ WindowsPowerShell \ V1.0 \ powershell.exe」 「-file」 「%1」 %*

你可能想要把一個-NoProfile參數也取決於你的個人資料。

+3

我覺得關鍵是在你的第6步,你在參數傳遞的PowerShell 。可執行程序。 Daniel說他已經將PS1文件與PowerShell相關聯,但是沒有額外的%1%*規格就不會傳遞參數。另請注意,-File參數在V1中不可用。這對V2來說是新的。 – 2009-08-18 16:25:00

+0

關於-file參數的好消息我已經忘記了。 – EBGreen 2009-08-18 16:33:49

+0

我必須安裝V2才能嘗試您的建議。謝謝。當你說這是一個基本的安全功能時,你說的「這個」是什麼意思?從Cmd.exe調用PowerShell腳本,就像它是.com/.bat/.exe文件一樣?將參數傳遞給腳本? – 2009-08-19 03:32:28

4

也許你可以用PowerShell的調用在.bat文件像這樣:

rem ps.bat 
@echo off 
powershell.exe -command "%*" 

如果再放入你的PATH一個文件夾下的文件,你可以調用PowerShell腳本是這樣的:

ps foo 1 2 3 

引用可以變得有些混亂,但:

ps write-host """hello from cmd!""" -foregroundcolor green 
+0

+1顯示三重引號。這讓我陷入了一段時間。 – DeanOC 2014-07-27 06:23:01

1

你可能看不到「xuxu p1 p2 p3 p4」。但是,當你在PowerShell和設置

PS > set-executionpolicy Unrestricted -scope currentuser 

您可以像這樣運行這些腳本:

./xuxu p1 p2 p3 p4 

.\xuxu p1 p2 p3 p4 

./xuxu.ps1 p1 p2 p3 p4 

我希望讓你對Powe更舒適一些rShell。

26

This article有幫助。特別是,本節:

- 文件

運行在局部範圍內指定的腳本(「點源」),這樣的函數和變量的腳本創建在當前會話中可用。輸入腳本文件路徑和任何參數。文件必須是命令中的最後一個參數,因爲在File參數名稱後輸入的所有字符都被解釋爲腳本文件路徑,後跟腳本參數。

powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3 

裝置運行該文件myfile.ps1和ARG1 ARG2 & ARG3是用於PowerShell腳本的參數。

8

在文件中聲明參數,如param([string] $ para1 ....... [string] $ param2)。

現在所說的PowerShell的文件中像temp.ps1 para1 para2....para10

11

通過PowerShell的文檔挖後,我發現這個問題的一些有用的信息。如果您在文件的開頭使用param(...),則不能使用$args;相反,您需要使用$PSBoundParameters。我將你的代碼複製/粘貼到一個PowerShell腳本中,並且它在PowerShell版本2中的工作方式與你期望的相同(我不確定當你遇到這個問題時你是什麼版本的)。

如果您使用的是$PSBoundParameters(如果您在腳本的開頭使用param(...),則這隻適用),那麼它不是一個數組,它是一個散列表,因此您需要使用鍵來引用它/值對。

param($p1, $p2, $p3, $p4) 
$Script:args="" 
write-host "Num Args: " $PSBoundParameters.Keys.Count 
foreach ($key in $PSBoundParameters.keys) { 
    $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + " " 
} 
write-host $Script:args 

當一個名爲...

PS> ./foo.ps1 a b c d 

結果是...

Num Args: 4 
$p1=a $p2=b $p3=c $p4=d 
相關問題