这是我的powershell脚本test.ps1:
Write-Output $args;
现在假设我有一个批处理脚本,它用各种路径调用这个powershell脚本。其中之一是c:\
:
powershell -executionpolicy Bypass -file test.ps1 "c:\"
输出结果为:
C:“
有没有办法引用我的参数,以便c:\实际上会被采用并存储在<{1>}变量中的 ?我知道我可以通过传递$args[0]
来解决这个 quick'dirty ,但这不是一个真正的解决方案。
编辑:在test.ps1中使用命名参数没有任何区别:
"c:\\"
EDIT2:使用批处理文件可以正常工作。
我的test.bat脚本:
[CmdletBinding()]
param(
[string]$argument
)
Write-Output $argument;
我跑了:
echo %~1
很好地返回:
C:\
答案 0 :(得分:1)
你确定这是来自powershell而不是来自调用你声明的程序吗?反斜杠在powershell中不是转义码。
我的test.ps1正在运行,当从ise运行时。
这对我有用:
powershell -executionpolicy Bypass -command "test.ps1 -argument 'C:\'"
(以报价双引号结束)
答案 1 :(得分:1)
PowerShell.exe的帮助文件说:
文件必须是命令中的最后一个参数,因为在文件参数名称后键入的“所有字符”被“解释”为脚本参数后面的脚本文件路径。
您反对Powershell.exe的命令行解析器,它使用“\”来转义引号。你需要报价吗?不是你的情况:
powershell -file test.ps1 c:\
打印
c:\
同样,这也有效
powershell -file test.ps1 "c:\ "
c:\
然后你的arg有你想要修剪的额外空间。 BTW,单引号在这里没有帮助:
powershell -file test.ps1 'c:\'
'c:\'
答案 2 :(得分:0)
如果您需要将最终反弹传递给命令,则可以使用
$ArgWithABackslashTemp = $ArgWithABackslash -replace '\\$','\\'
&$ExePath $ArgWithABackslashTemp
或者,如果exe足够聪明,可以在没有反斜杠的情况下处理它
&$ExePath $ArgWithABackslash.trim('\')