相关疑难解决方法(0)

Powershell使用嵌套引号调用msbuild

使用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;

msbuild powershell psake

25
推荐指数
3
解决办法
1万
查看次数

如何用sed用双引号括起文件中的每一行?

这是我试过的: sed -i 's/^.*/"$&"/' myFile.txt

它在每行的开头放了一个$.

windows sed

25
推荐指数
3
解决办法
1万
查看次数

如何在Windows批处理文件中运行PowerShell脚本

如何将PowerShell脚本嵌入到与Windows批处理脚本相同的文件中?

我知道在其他情况下这种事情是可能的:

  • 在批处理脚本中嵌入SQL,sqlcmd并在文件开头巧妙地安排goto和注释
  • 在具有程序名称的*nix环境中,您希望在脚本的第一行运行脚本,例如,#!/usr/local/bin/python.

可能没有办法做到这一点 - 在这种情况下,我将不得不从启动脚本调用单独的PowerShell脚本.

我考虑过的一个可能的解决方案是回显PowerShell脚本,然后运行它.这样做的一个很好的理由是,尝试这个的部分原因是使用PowerShell环境的优点而没有例如转义字符的痛苦

我有一些不寻常的限制,并希望找到一个优雅的解决方案.我怀疑这个问题可能是各种各样的反应:"你为什么不尝试解决这个不同的问题." 我只想说这些是我的约束,对此感到抱歉.

有任何想法吗?是否有一个巧妙的评论和转义字符的合适组合,这将使我能够实现这一目标?

关于如何实现这一点的一些想法:

  • ^一行中的克拉是一个延续 - 就像Visual Basic中的下划线一样
  • &符号&通常用于将命令echo Hello & echo World结果分成两个回声在不同的行上
  • %0将为您提供当前正在运行的脚本

所以这样的事情(如果我可以使它工作)会很好:

# & 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)

除了...

  • 它不起作用......因为
  • 文件的扩展名不符合PowerShell的喜好: Windows PowerShell console file "insideout.bat" extension is not psc1. Windows PowerShell console file extension must be …

windows powershell scripting cmd batch-file

19
推荐指数
6
解决办法
2万
查看次数

C#Process Start需要带双引号的参数 - 它们会消失

我正在尝试使用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"等.

再次感谢.

c# matlab cmd process.start command-line-arguments

9
推荐指数
1
解决办法
7365
查看次数

如何将PowerShell的文字双引号传递给本机命令?

我想使用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可能与此有关: …

windows powershell

8
推荐指数
1
解决办法
4266
查看次数

PowerShell使用Start-Process在脚本块中执行函数会使用双引号进行奇怪的操作

我有一个编辑注册表的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所提到的,解决方案是用双引号,单引号包装任何双引号,或者你可以使用括号.

所以在我的例子中,你会改变: …

string powershell function start-process scriptblock

6
推荐指数
1
解决办法
8702
查看次数

为什么命令在 Windows CMD 中工作而不是在 PowerShell 中工作?

我有一个将可执行文件和 .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 psexec

1
推荐指数
1
解决办法
2335
查看次数