Powershell 启动进程和停止解析(-%)参数

Powershell 启动进程和停止解析(-%)参数,powershell,escaping,start-process,Powershell,Escaping,Start Process,我无法使-->%参数按预期工作。My$TaskParams变量具有字符”停止解析符号--%仅在直接调用可执行文件或使用调用操作符&时有效;它不用于调用PowerShell脚本/函数/cmdlet 停止解析符号-->%仅在直接调用可执行文件或通过调用操作符&调用可执行文件时有效;它不用于调用PowerShell脚本/函数/cmdlet 如果您真的想使用启动进程,您可以对参数进行编码,并以此方式运行它。我在通过UAC提升时使用类似的方法: $Code = ". '$ScriptLocation' $

我无法使
-->%
参数按预期工作。My
$TaskParams
变量具有字符
”停止解析符号
--%
仅在直接调用可执行文件或使用调用操作符
&
时有效;它不用于调用PowerShell脚本/函数/cmdlet

停止解析符号
-->%
仅在直接调用可执行文件或通过调用操作符
&
调用可执行文件时有效;它不用于调用PowerShell脚本/函数/cmdlet

如果您真的想使用
启动进程
,您可以对参数进行编码,并以此方式运行它。我在通过UAC提升时使用类似的方法:

$Code = ". '$ScriptLocation' $TaskParams"
$Encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($code))

Start-Process PowerShell.exe -ArgumentList "-EncodedCommand",$Encoded -Wait -PassThru

我很确定这将完成您想要的任务。

如果您真的想使用
启动进程
,您可以对参数进行编码,并以此方式运行它。我在通过UAC提升时使用类似的方法:

$Code = ". '$ScriptLocation' $TaskParams"
$Encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($code))

Start-Process PowerShell.exe -ArgumentList "-EncodedCommand",$Encoded -Wait -PassThru

我很确定这将完成您所寻找的任务。

您不需要启动powershell.exe的新副本,也不需要使用
启动进程
从另一个脚本中运行脚本。只需将脚本命令及其参数作为另一个脚本中的一行。例如,假设您有script2.ps1:

param(
  [String] $Name
)
Write-Host "Hello, $Name"
现在假设您还有script1.ps1:

Write-Host "This is script1.ps1"
.\Script2.ps1 -Name "Bill Stewart"
Write-Host "script1.ps1 is finished"
PS C:\> .\Script1.ps1
This is script1.ps1
Hello, Bill Stewart
script1.ps1 is finished
如果现在运行script1.ps1:

Write-Host "This is script1.ps1"
.\Script2.ps1 -Name "Bill Stewart"
Write-Host "script1.ps1 is finished"
PS C:\> .\Script1.ps1
This is script1.ps1
Hello, Bill Stewart
script1.ps1 is finished

您不需要启动powershell.exe的新副本,也不需要使用
Start Process
从另一个脚本中运行脚本。只需将脚本命令及其参数作为另一个脚本中的一行。例如,假设您有script2.ps1:

param(
  [String] $Name
)
Write-Host "Hello, $Name"
现在假设您还有script1.ps1:

Write-Host "This is script1.ps1"
.\Script2.ps1 -Name "Bill Stewart"
Write-Host "script1.ps1 is finished"
PS C:\> .\Script1.ps1
This is script1.ps1
Hello, Bill Stewart
script1.ps1 is finished
如果现在运行script1.ps1:

Write-Host "This is script1.ps1"
.\Script2.ps1 -Name "Bill Stewart"
Write-Host "script1.ps1 is finished"
PS C:\> .\Script1.ps1
This is script1.ps1
Hello, Bill Stewart
script1.ps1 is finished


为什么需要
启动进程powershell.exe
?只需使用所需的参数运行脚本。如果不启动进程,则无法让脚本执行任何操作。你能说出你的想法吗?谢谢!为什么需要启动新的PowerShell进程并使用
启动进程
?只需运行脚本。因为我是从一个单独的.ps1运行的,所以您可以直接从另一个.ps1文件运行一个.ps1文件。只需将脚本名称放入另一个脚本并运行它。我总是这样!为什么需要
启动进程powershell.exe
?只需使用所需的参数运行脚本。如果不启动进程,则无法让脚本执行任何操作。你能说出你的想法吗?谢谢!为什么需要启动新的PowerShell进程并使用
启动进程
?只需运行脚本。因为我是从一个单独的.ps1运行的,所以您可以直接从另一个.ps1文件运行一个.ps1文件。只需将脚本名称放入另一个脚本并运行它。我总是这样!啊,这就解释了。调用PowerShell脚本时,是否有其他方法在变量中转义PowerShell命令或表达式(在本例中为重定向<字符)?@Quanda
Start Process
有一个
-ArgumentList
参数,您应该使用该参数传递参数。您可以尝试将它们作为单个字符串发送,但也可以将它们拆分为一个数组:
-ArgumentList'arg1'、'arg2'、'argument three'、'a4'
。但是我可以转义PS系统表达式吗(例如,“@Quanda您可能不需要。请先尝试一下。您能展示一个使用ArgumentList作为带有命名参数的数组的示例吗?它是这样的吗?
-ArgumentList'-arg1Name$arg1Value',“-arg2Name$arg2Value'”
这就很好地解释了。是否有其他方法来转义PowerShell命令或表达式(在这种情况下,重定向<字符)调用powershell脚本时在变量中?@Quanda
Start Process
有一个
-ArgumentList
参数,您应该使用它来传递参数。您可以尝试将它们作为单个字符串发送,但也可以将它们拆分为数组:
-ArgumentList'arg1'、'arg2'、'argument three'、'a4'
。但是我可以吗e PS系统表达式(例如,“@Quanda您可能不需要。请先尝试一下。您可以展示一个使用ArgumentList作为带有命名参数的数组的示例吗?它是这样的吗?
-ArgumentList'-arg1Name$arg1Value',“-arg2Name$arg2Value'
我喜欢
-EncodeCommand
!这是实现所需结果的一个很好的方法,只要问题是这不是由PowerShell错误调整角色造成的(我不确定它在本例中的何处造成了障碍,因为我只是没有机会)。我喜欢
-EncodedCommand
!这是实现所需结果的好方法,只要问题不是由PowerShell错误调整角色造成的(事实上,我不确定它是在什么地方造成这种情况下的障碍,因为我只是没有机会).哇,这么简单又美观。谢谢@Bill_Stewart!现在这让我思考。如果我有多个参数,并且希望它们包含在一个变量中,那该怎么办?让我看看我现在是否可以让它们工作。@Quanda如果你想将它们放在一个变量中,请将它们设置为
[哈希表]
,不是字符串,然后使用以下方式调用:
\Script1.ps1@myParams
(其中
$myParams
是哈希表变量)。这显示了问一个好问题的一些价值。问题根本不是关于引用,而是这样:“如何从一个PowerShell脚本中调用另一个?”感谢你们两位的帮助。我最初的问题实际上是如何避开像“哇,这么简单和美观。谢谢你@Bill_Stewart!现在这让我思考。如果我有多个参数,并希望它们包含在一个变量中,那该怎么办?让我看看我现在是否能让它们工作。@Quanda如果你想将它们放入一个变量中,让它们成为变量一个
[hashtable]
,不是一个字符串,然后像这样调用:
\Script1.ps1@myParams
(其中
$myParams
是hashtable变量)。这显示了问一个好问题的一些价值。这个问题不是