脚本用于CLI,在Microsoft世界中,引用文件的脚本参数通常可能有空格要求它们被引用。
这对我来说是个问题。考虑一下这个脚本:
#testarg.ps1
for($i=0; $i -lt $args.length; $i++)
{
write-host "Arg$i = $($args[$i])"
}
如果我在PowerShell交互式环境中运行它,如下所示:
PS C:\script> .\testarg.ps1 "first arg" "second arg"
我按预期得到了
Arg0 = first arg
Arg1 = second arg
但是,在交互模式之外,脚本的普通使用将是批量使用。据我所知,从cmd.exe
运行脚本the Microsoft suggested way似乎是powershell.exe path\to\script.ps1
(路径中没有空格)。但是:
powershell.exe .\testarg.ps1 "first arg" "second arg"
给出了不一致的结果:
Arg0 = first
Arg1 = arg
Arg2 = second
Arg3 = arg
我注意到为了获得预期的结果,我可以使用单引号:
powershell.exe .\testarg.ps1 'first arg' 'second arg'
但是,当脚本由GUI工具运行时,这通常是不可行的,GUI工具会自动生成并传递参数,和/或存在更多CLI工具,以便使用引号保持一致。
使用-file
选项时出于某种原因:
powershell.exe –file .\testarg.ps1 "first arg" "second arg"
::(reference to relative path '.\' is optional)
我再次得到了预期的结果:
Arg0 = first arg
Arg1 = second arg
因此,使用-file
选项,双引号可正常工作。这表明可以将ps1
文件(带FTYPE.exe
)的Windows文件类型关联重新映射为:
FTYPE Microsoft.PowerShellScript.1=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file "%1" %*
鉴于FTYPE关联,我可以通过简单地写:
来获得预期的结果testarg.ps1 "first arg" "second arg"
后者对我来说非常令人满意,但由于我是PowerShell的新手,我想知道:
powershell.exe –file path\to\script.ps1
和交互式表单(来自PowerShell中)PS > path\to\script.ps1
是否相同?是否存在两种形式可能产生不同输出/效果的情况?*%
的{{1}}。答案 0 :(得分:1)
当你写下来时,我有一件事我不明白:
testarg.ps1 "first arg" "second arg"
你在哪个批次中调用它?
来自PowerShell.exe
,应该写成:
cd "c:\Temp"
& .\testarg.ps1 "first arg" "second arg"
从cmd.exe
开始,应写明:
powershell –file .\testarg.ps1 "first arg" "second arg"