使用Powershell和Psake为可视化工作室解决方案创建包和部署.尝试使用msbuild部署数据库项目 - 使用msdos visual studio命令行正常工作
msbuild /target:Deploy /p:UseSandboxSettings=false /p:TargetConnectionString="aConnectionWithSpacesAndSemiColons" "aDatabaseProjectPathWithSpaces"
Run Code Online (Sandbox Code Playgroud)
从powershell调用时,相同的方法调用会导致错误
& msbuild /target:Deploy /p:UseSandboxSettings=false /p:TargetConnectionString="aConnectionWithSpacesAndSemiColons" "aDatabaseProjectPathWithSpaces"
Run Code Online (Sandbox Code Playgroud)
与空间有关 - 无法弄清楚如何在powershell中复制此调用 - 示例数据库连接字符串数据源=.\ SQL2008;初始目录= DocumentExecution; Integrated Security = True;
这是我试过的: sed -i 's/^.*/"$&"/' myFile.txt
它在每行的开头放了一个$.
如何将PowerShell脚本嵌入到与Windows批处理脚本相同的文件中?
我知道在其他情况下这种事情是可能的:
sqlcmd
并在文件开头巧妙地安排goto和注释#!/usr/local/bin/python
.可能没有办法做到这一点 - 在这种情况下,我将不得不从启动脚本调用单独的PowerShell脚本.
我考虑过的一个可能的解决方案是回显PowerShell脚本,然后运行它.不这样做的一个很好的理由是,尝试这个的部分原因是使用PowerShell环境的优点而没有例如转义字符的痛苦
我有一些不寻常的限制,并希望找到一个优雅的解决方案.我怀疑这个问题可能是各种各样的反应:"你为什么不尝试解决这个不同的问题." 我只想说这些是我的约束,对此感到抱歉.
有任何想法吗?是否有一个巧妙的评论和转义字符的合适组合,这将使我能够实现这一目标?
关于如何实现这一点的一些想法:
^
一行中的克拉是一个延续 - 就像Visual Basic中的下划线一样&
通常用于将命令echo Hello & echo World
结果分成两个回声在不同的行上所以这样的事情(如果我可以使它工作)会很好:
# & call powershell -psconsolefile %0
# & goto :EOF
/* From here on in we're running nice juicy powershell code */
Write-Output "Hello World"
Run Code Online (Sandbox Code Playgroud)
除了...
Windows PowerShell console file "insideout.bat" extension is not psc1. Windows PowerShell console file extension must be …
我正在尝试使用Process.Start(ProcessStartInfo)从c#运行cmd行应用程序;
问题是,cmd行应用程序是一个matlab独立的.exe并且具有可选参数,这意味着您可以在cmd行上传递它们:
app.exe "optional1" optional1value "optional2" optional2value
Run Code Online (Sandbox Code Playgroud)
其中optional1value是整数或字符串等.
我们遇到的问题是双引号不是作为"optional1"参数的一部分传递的,所以我相信cmd.exe会得到类似的东西:
app.exe optional1 optional1value optional2 optional2value
Run Code Online (Sandbox Code Playgroud)
或类似的东西,matlab的解析器显然会被混淆.
我试过了:
@"""optional1"" optional1value ""optional2" optional2value"""
Run Code Online (Sandbox Code Playgroud)
正如其他一些关于cmd行参数中的双引号的SO问题所暗示的那样,但它似乎对我没有用,也没有:
"\"optional1\" optional1value \"optional2\" optional2value\""
Run Code Online (Sandbox Code Playgroud)
我写了一个小的c#命令行.exe来打印出它得到的参数.如果我将命令行参数放在VS Project-> Debug区域并运行它然后用双引号打印它们但由于所有转义等等,当我在代码中执行此操作时,.exe打印参数而不带任何双引号.
我发现这篇文章可能是.NET 3.5的cmd解析器中的一个错误,但似乎找不到可行的解决方案.
有没有人有任何想法?
感谢您的时间,
雨披
PS有没有办法看到使用Process.Start()发送参数时cmd.exe得到了什么?我让我的进程打开一个cmd窗口但是很高兴看到cmd.exe行如下所示:"app.exe optional1 optional1value"等.
再次感谢.
我想使用Powershell命令行在awk/gawk中打印字符串文字(具体程序不重要).但是,我认为我误解了引用规则 - PowerShell显然删除了本机命令的单引号内的双引号,但在将它们传递给命令行开关时却没有.
这适用于bash:
bash$ awk 'BEGIN {print "hello"}'
hello <-- GOOD
Run Code Online (Sandbox Code Playgroud)
这适用于PowerShell - 但重要的是我不知道为什么需要转义:
PS> awk 'BEGIN {print \"hello\"}'
hello <-- GOOD
Run Code Online (Sandbox Code Playgroud)
这在PowerShell中不打印任何内容:
PS> awk 'BEGIN {print "hello"}'
<-- NOTHING IS BAD
Run Code Online (Sandbox Code Playgroud)
如果这确实是在PowerShell中执行此操作的唯一方法,那么我想了解解释原因的引用规则链.根据http://technet.microsoft.com/en-us/library/hh847740.aspx上的PowerShell引用规则,这不是必需的.
开始解决方案
下面的Duncan提供的妙语是,您应该将此功能添加到您的powershell配置文件中:
filter Run-Native($command) { $_ | & $command ($args -replace'(\\*)"','$1$1\"') }
Run Code Online (Sandbox Code Playgroud)
或者特别是对于awk:
filter awk { $_ | gawk.exe ($args -replace'(\\*)"','$1$1\"') }
Run Code Online (Sandbox Code Playgroud)
结束解决方案
引号正确传递给PowerShell的echo:
PS> echo '"hello"'
"hello" <-- GOOD
Run Code Online (Sandbox Code Playgroud)
但是当呼唤外部"本地"程序时,引号会消失:
PS> c:\cygwin\bin\echo.exe '"hello"'
hello <-- BAD, POWERSHELL REMOVED THE QUOTES
Run Code Online (Sandbox Code Playgroud)
这是一个更清晰的例子,如果您担心Cygwin可能与此有关: …
我有一个编辑注册表的PowerShell脚本,所以它需要以管理员身份运行.为此,我从运行的PowerShell脚本启动一个新的PowerShell进程,并使用带有函数的脚本块传递部分注册表键路径.当我在该函数中使用双引号时,PowerShell会尝试将它们解释为命令,而不是字符串.如果我使用单引号,那么一切正常.
我创建了一个简单的样本PowerShell脚本来重现问题.这是片段:
$ScriptBlock = {
function Test
{
$status = "This is a string"
Write-Output $status
}
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"
Run Code Online (Sandbox Code Playgroud)
因此,在新的PowerShell流程中,它将首先在脚本块中定义代码,然后调用Test方法,并产生以下错误:
这:术语"This"不被识别为cmdlet,函数,脚本文件或可操作程序的名称.检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试.
所以它试图将字符串视为一个commad,就好像我刚刚This is a string
在我的脚本中的新行上键入它一样.
如果我换行
$status = "This is a string"
Run Code Online (Sandbox Code Playgroud)
至
$status = 'This is a string'
Run Code Online (Sandbox Code Playgroud)
该脚本按预期工作,只是输出字符串This is a string
.
我注意到的另一个奇怪的问题是,如果我不使用变量,只需使用:
Write-Output "This is a string"
Run Code Online (Sandbox Code Playgroud)
然后它在一个单独的行上输出每个单词,如下所示:
这个
是
一个
串
但如果我使用这样的单引号:
Write-Output 'This is a string'
Run Code Online (Sandbox Code Playgroud)
然后它按预期在一行输出整个句子.
有人知道为什么PowerShell在这些情况下会表现得很奇怪吗?
正如TessellatingHeckler所提到的,解决方案是用双引号,单引号包装任何双引号,或者你可以使用括号.
所以在我的例子中,你会改变: …
我有一个将可执行文件和 .ps1 保存到远程计算机列表的脚本。然后在每台计算机上运行可执行文件。由于静默运行时的设置方式,我必须使用 .ps1 调用可执行文件。
我注意到我的一个命令从命令行快速运行,但似乎挂在我的脚本中。有什么理由会发生这种情况吗?
命令是:
psexec -s @C:\myscript\computers.txt cmd /c "Powershell Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass && PowerShell -noninteractive -file "C:\Install.ps1""
Run Code Online (Sandbox Code Playgroud)
这是我的整个脚本:
cls #clear screen
function CopyFiles {
# Get .exe from source and place at destination workstation
$source2="\\mainserver\program.exe"
$destination2="\\$line\c$\program.exe" # place .exe on C:\ directory of worstation
Copy-Item -Recurse -Filter *.* -path $source2 -destination $destination2 -Force
# Get .bat from source and place at destination workstation
$source3="\\fileserver\Install.ps1"
$destination3="\\$line\c$\Install.ps1" # place .bat on C:\ directory of worstation
Copy-Item …
Run Code Online (Sandbox Code Playgroud) powershell ×5
windows ×3
cmd ×2
batch-file ×1
c# ×1
function ×1
matlab ×1
msbuild ×1
psake ×1
psexec ×1
scriptblock ×1
scripting ×1
sed ×1
string ×1