如何在PowerShell中运行以下命令?
C:\ Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql ="Data Source = mysource; Integrated Security = false; User ID = sa; Pwd = sapass !; Database = mydb;" -dest:dbfullsql ="Data Source =.\ mydestsource; Integrated Security = false; User ID = sa; Pwd = sapass !; Database = mydb;",computername = 10.10.10.10,username = administrator,password = adminpass"
我可以通过以下方案表达我的需求:编写一个接受字符串的函数作为本机命令运行.
这并不是一个想法:如果你正在与公司其他地方的其他命令行实用程序连接,那么它将为你提供逐字运行的命令.因为您不控制命令,所以您需要接受任何有效的命令作为输入.这些是我无法轻易克服的主要问题:
该命令可能执行生活在其中包含空格的路径中的程序:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
Run Code Online (Sandbox Code Playgroud)该命令可能包含带空格的参数:
$command = 'echo "hello world!"';
Run Code Online (Sandbox Code Playgroud)该命令可能包含单蜱和双蜱:
$command = "echo `"it`'s`"";
Run Code Online (Sandbox Code Playgroud)有没有干净的方法来完成这个?我只能设计出奢华和丑陋的变通方法,但对于脚本语言,我觉得这应该是简单的.
我有一个命令,我已经构建并存储在PowerShell中的变量中.如果我执行Write-Host并将其复制并粘贴到标准cmd.exe窗口中,则此命令有效.
如何从脚本中执行此命令?
我已经尝试了几种Invoke-Command或Invoke-Expression的组合而没有运气.
这是我构建变量的方式:
$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"
Run Code Online (Sandbox Code Playgroud)
这是变量在打印到屏幕时的样子:
7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PowerShell脚本执行EXE文件.如果我使用命令行它没有问题(首先我提供可执行文件的名称和一系列参数来调用它):
"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode
Run Code Online (Sandbox Code Playgroud)
但是在脚本中执行完全相同的操作会返回错误:
术语 "C:\ Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe"C:\ temp\TestProject1\TestProject1.pjs/run/exit/SilentMode' 无法识别为cmdlet的名称,函数,脚本文件或可操作程序.检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试.
(我使用"&"运算符调用了命令.)
我该如何解决这个问题?
我可以运行这个罚款:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
start-process $msbuild -wait
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码(下面)时,我收到一个错误:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo"
start-process $msbuild -wait
Run Code Online (Sandbox Code Playgroud)
有没有办法可以使用start-process将参数传递给MSBuild?我愿意不使用启动过程,我使用它的唯一原因是我需要将"命令"作为变量.
当我
在一行上有
C:\ WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe/v:q/nologo
时,如何在Powershell中处理它?
我应该使用某种eval()类型的函数吗?
最近,每当涉及双引号时,我在使用PowerShell的GnuWin32时遇到了一些麻烦.
经过进一步调查,看起来PowerShell正在从命令行参数中删除双引号,即使正确转义也是如此.
PS C:\Documents and Settings\Nick> echo '"hello"'
"hello"
PS C:\Documents and Settings\Nick> echo.exe '"hello"'
hello
PS C:\Documents and Settings\Nick> echo.exe '\"hello\"'
"hello"
Run Code Online (Sandbox Code Playgroud)
请注意,双引号在传递给PowerShell的echo cmdlet时会出现,但是当作为参数传递给echo.exe时,除非使用反斜杠进行转义,否则将删除双引号(即使PowerShell的转义字符是反引号,而不是反斜杠).
这对我来说似乎是个错误.如果我将正确的转义字符串传递给PowerShell,那么PowerShell应该处理可能需要的任何转义,但是它会调用该命令.
这里发生了什么?
目前,修复方法是根据这些规则转义命令行参数(这似乎是CreateProcessPowerShell用来调用.exe文件的API调用):
\"- >"\\\\\"- >\\"\\- >\\请注意,可能需要进一步转义双引号以将Windows API转义字符串中的双引号转义为PowerShell.
下面是一些例子,与echo.exe从的GnuWin32:
PS C:\Documents and Settings\Nick> echo.exe "\`""
"
PS C:\Documents and Settings\Nick> echo.exe "\\\\\`""
\\"
PS C:\Documents and Settings\Nick> echo.exe "\\"
\\
Run Code Online (Sandbox Code Playgroud)
我想如果你需要传递一个复杂的命令行参数,这很快就会成为地狱.当然,这些都没有记录在CreateProcess()PowerShell文档中.
另请注意,将双引号的参数传递给.NET函数或PowerShell cmdlet不是必需的.为此,您只需要将双引号转义为PowerShell.
我在参数中遇到空格问题,我尝试从powershell脚本发送到msdeploy.
还有许多其他相关文章,但没有一个解决问题.
使用Power Shell和MSDeploy的问题.
类似的SO问题不起作用:如何在带有空格和引号的参数的
PowerShell中运行exe PowerShell BUG:执行需要引号和变量的命令实际上是不可能的
另一个SO问题不起作用:在PowerShell 2.0中传递参数
当我使其变得更复杂时,成功然后失败的最简单的例子就是转储默认网站.
$ msdeploy ="C:\ Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
&$ msdeploy -verb:dump -source:appHostConfig =`'default web site`'-verbose
== SUCCESS
这个?
$ sitename ="默认网站"
&$ msdeploy -verb:dump -source:appHostConfig = $ sitename -verbose
== FAIL,出现以下错误
msdeploy.exe:错误:无法识别的参数'" - source:"appHostConfig = default'.所有参数必须以" - "开头.
在C:\ xxx\test.ps1:122 char:6
+&
+ CategoryInfo:NotSpecified :(错误:Unrecogn ...以" - "开头:String)[],RemoteException
+ FullyQualifiedErrorId:NativeCommandError
错误计数:1.
以下变化也失败了
#FAIL
$ sitename =`'默认网站''
$ sitename =`'"默认网站"`'
$ sitename ="`''默认网站`'"
$ sitename ="默认网站"
$ …
我正在使用powershell脚本生成带有数据库密码等的配置文件.这个脚本的正常用法是生成并使用密码,但是稍等片刻,我需要访问其他开发人员的数据库,因此我需要将密码传递给powershell脚本.
问题是密码是乱码,包括&符号,分号和花括号.我怎样才能将它传递给powershell的命令行调用?(这个答案和另一个答案是有帮助的,但对分号和花括号没有帮助.)
这是我尝试过的:
powershell .\makeConfig.ps1 -password "xxx<xxxx;xxxxx&x.xxxx}xx/xxx" -otherparam 3
Run Code Online (Sandbox Code Playgroud)
结果:错误消息:不允许使用&符号.&运营商留作将来使用; 用双引号("&")包装&符号以将其作为字符串的一部分传递.
powershell .\makeConfig.ps1 -password "xxx<xxxx;xxxxx`"&`"x.xxxx}xx/xxx" -otherparam 3
Run Code Online (Sandbox Code Playgroud)
结果:执行$ password的写主机只会将字符串赋予分号.另外,-otherparam有默认值,而不是我传入命令行的值.
powershell .\makeConfig.ps1 -password "xxx<xxxx`;xxxxx`"&`"x.xxxx}xx/xxx" -otherparam 3
Run Code Online (Sandbox Code Playgroud)
结果:write-host $ password现在打印到报价前的第一个反引号.是的,它会输出反引号,这似乎表明一切都在解析所有错误.哦,脚本中调用的其他函数之一引发了一个我以前没见过的异常(异常调用带有"4"参数的"AcquireToken":"authentication_canceled:用户取消认证"),这表明该参数解析完全以一种新的迷人方式进行了解析.这是写入主机$密码产生的:
xxx<xxxx;xxxxx`
powershell .\makeConfig.ps1 -password "xxx<xxxx`";`"xxxxx`"&`"x.xxxx}xx/xxx" -otherparam 3
Run Code Online (Sandbox Code Playgroud)
结果:write-host $ password现在打印到报价前的第一个反引号.第二个参数处于默认状态.(即,与上次相同的结果.)在正面,上一个例子中抛出的异常没有出现.
那么如何从Windows命令行将任意ASCII字符串传递给powershell字符串参数?或者至少,我如何逃脱分号,&符号和花括号?
我试图从powershell脚本运行外部exe.
这个exe需要4个参数.
我一直在尝试invoke-item,invoke-command和'C:\ program files\mycmd.exe myparam'的每一个组合,在C:\中创建一个快捷方式来摆脱路径中的空格.
我可以使用一个参数,但不能更多.我收到各种错误.
总结一下,如何向exe发送4个参数?
我正在尝试运行MSTest.exe C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE.更重要的是,我将当前目录中的所有程序集都设置为单独的/ testcontainer参数.如果没有PowerShell的抱怨,我无法弄清楚如何做到这一点.
$CurrentDirectory = [IO.Directory]::GetCurrentDirectory()
$MSTestCall = '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"'
foreach($file in Get-ChildItem $CurrentDirectory)
{
if($file.name -match "\S+test\S?.dll$" )
{
$MSTestArguments += "/TestContainer:" + $file + " "
}
}
$MSTestArguments += " /resultsFile:out.trx"
$MSTestArguments += " /testsettings:C:\someDirectory\local64.testsettings"
Invoke-Expression "$MSTestCall $MSTestArguments"
Run Code Online (Sandbox Code Playgroud)
我从这段代码得到的错误是:
Invoke-Expression:您必须在'/'运算符的右侧提供值表达式.
当我尝试在名称中没有空格的目录中调用mstest.exe时,我不会收到此错误(不需要额外的").
当我尝试使用时&,
&$MSTestCall $MSTestArguments
Run Code Online (Sandbox Code Playgroud)
它将$ MSTestArguments作为单个参数交给MSTest提示抛出.建议?
powershell ×10
parameters ×3
command-line ×2
spaces ×2
cmd ×1
exe ×1
iis ×1
msdeploy ×1
quotes ×1
scripting ×1
windows ×1