多年来,我使用了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
shell中,而不是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>
答案 0 :(得分:29)
This article有帮助。特别是,本节:
-File
在本地范围(“dot-sourced”)中运行指定的脚本,以便脚本创建的函数和变量在当前会话中可用。输入脚本文件路径和任何参数。文件必须是命令中的最后一个参数,因为在File参数名称后键入的所有字符都被解释为脚本文件路径,后跟脚本参数。
即。
powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3
表示运行文件myfile.ps1和arg1 arg2& arg3是PowerShell脚本的参数。
答案 1 :(得分:17)
好的,首先这是打破PowerShell中的基本安全功能。根据这种理解,您可以采用以下方式:
您可能还想在其中添加-NoProfile
参数,具体取决于您的个人资料的作用。
答案 2 :(得分:15)
在深入了解PowerShell文档后,我发现了一些有关此问题的有用信息。如果您在文件开头使用$args
,则无法使用param(...)
;相反,您需要使用$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
答案 3 :(得分:9)
在文件中声明你的参数,比如param([string] $ para1 ....... [string] $ param2)。
现在调用PowerShell文件,如temp.ps1 para1 para2....para10
等。
答案 4 :(得分:6)
也许您可以将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
答案 5 :(得分: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
我希望这会让你对PowerShell更加舒服。
答案 6 :(得分:0)
如果要从cmd调用ps1脚本并传递参数而不调用脚本,例如
powershell.exe script.ps1 -c test
script -c test ( wont work )
您可以执行以下操作
setx PATHEXT "%PATHEXT%;.PS1" /m
assoc .ps1=Microsoft.PowerShellScript.1
ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*
这假设powershell.exe在您的路径中
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype