2009-08-18 316 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 
相关问题