嵌入 Powershell 脚本问题

Posted

技术标签:

【中文标题】嵌入 Powershell 脚本问题【英文标题】:Embedding in the Powershell script issue 【发布时间】:2015-07-07 09:26:11 【问题描述】:

根据其他用户的建议创建此问题,它是this 的后续行动。

场景是我目前正在尝试创建一个 Powershell 脚本,第一次使用的用户可以运行该脚本,它将安装一堆程序并完成几个配置更改。其中一项配置更改是创建一个包含两个 shell 命令的文件(在下面发布),然后每次加载 GitBash 时都会执行该文件。

我尝试输入 .sh 文件的命令是..(删除了 " 和 ')

alias proxyon=source $HOMEPATH/.proxy/proxy-switch.sh on

alias proxyoff=source $HOMEPATH/.proxy/proxy-switch.sh off

我正在尝试使用以下命令来执行此操作

add-content "$env:homepath\.proxy\TempProxy.bat" "alias proxyon='source "$HOMEPATH/.proxy/proxy-switch.sh on"'" 

但是,ps1脚本的执行抛出了一个错误,上面一行是

Add-Content : A positional parameter cannot be found that accepts argument '/.proxy/proxy-switch.sh'.

现在,另一位用户告诉我,如果我要使用 double " 我需要转义内引号。据我所知,Powershell 中的转义字符是 ` ,所以我尝试了以下方法。

add-content "$env:homepath\.proxy\TempProxy.bat" "alias proxyon='source `"$HOMEPATH/.proxy/proxy-switch.sh on"'" 

这给出了以下内容

字符串开始:在 C:\Chef\windowsdevbox-master\test.ps1:2 字符:113 + 添加内容 "$env:homepath.proxy\TempProxy.bat" "alias proxyon='source `"$HOMEPATH/.proxy/proxy-switch.sh on"

我也试过了

add-content "$env:homepath\.proxy\TempProxy.bat" "alias proxyon='source `"$HOMEPATH/.proxy/proxy-switch.sh on`"'" 

这不会出错,但是它不会添加 $HOMEPATH 的内容,而只会添加以下内容

alias proxyon='source "/.proxy/proxy-switch.sh on"'

对此的任何建议将不胜感激。

【问题讨论】:

您期待文件中的文字$HOMEPATH 还是环境变量扩展为什么?我的$HOMEPATH` which I don't think gets you the output you want. You are also using $env:homepath`,这可能就是你要找的。​​span> 我希望它添加 $HOMEPATH 的内容,在我的例子中是下面的 $ echo $HOMEPATH \Users\ 是一个替代品。此外, $env:homepath' 是一个 Powershell 命令。 $HOMEPATH 是一个 shell 命令,这就是为什么我需要它是这样的,因为它将在 GitBash 中运行。 你只需要用反引号来逃避那个吗? `$家庭路径。所以powershell不会尝试对它做任何事情。我不知道 Gitbash,但似乎你只需要逃避它。 老实说,关于“逃避它”的整体理解对我来说是新的。在上一个问题中有人告诉我要尝试的东西,我只是想通过这样做来学习,也就是尝试一切,然后问为什么它会起作用。 没问题。如果我们走在正确的轨道上,我会对此做出回答。 【参考方案1】:

我认为问题在于您希望在输出文件中使用文字 $homepath 以便让 GitBash 处理它。有很多方法可以尝试逃避和处理这个问题,但让我们与您合作,最后一个几乎准备好了。

add-content "$env:homepath\.proxy\TempProxy.bat" "alias proxyon='source `"`$HOMEPATH/.proxy/proxy-switch.sh on`"'" 

这里唯一不同的是$HOMEPATH前面的反引号。由于 PowerShell 使用 $ 来声明和引用变量,因此您需要对其进行转义,就像您对引号所做的那样,以防止 PowerShell 干扰它。

由于您没有名为$HOMEPATH 的变量,它是在当时创建的,其值为null。这就是为什么您上一个示例的输出看起来如此的原因。

使用格式运算符

另一个可能更容易理解的选项是使用格式运算符。如果您想将其临时存储在变量中,则可以使用它。

$content = "alias proxyon='0'" -f 'source "$HOMEPATH/.proxy/proxy-switch.sh on"'
add-content "$env:homepath\.proxy\TempProxy.bat" $content

或内联它会是

add-content "$env:homepath\.proxy\TempProxy.bat" ("alias proxyon='0'" -f 'source "$HOMEPATH/.proxy/proxy-switch.sh on"')

【讨论】:

谢谢!不得不稍作改动,但它奏效了。我使用了 "add-content "$env:homepath\.proxy\TempProxy.bat" "alias proxyon='source "$HOMEPATH/.proxy/proxy-switch.sh`"on'"" 代替。在第一组 '" 之后的 on 所以它给出了输出 "alias proxyon='source "$HOMEPATH/.proxy/proxy-switch.sh"on'" 我需要这样做,因为当它被输入到 GitBash 时将“On”解释为目录的一部分,而不是它所需的输入 @AdamCormack 很高兴为您提供帮助。您还可以使用格式运算符来消除对所有反引号的需要。更新了我的答案。

以上是关于嵌入 Powershell 脚本问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 PHP 使用 Exchange 管理单元执行 powershell 脚本

使用以下逻辑编写 Powershell 脚本的指南 [关闭]

无法在 Visual Studio Code 中调试 PowerShell 脚本

从 Powershell ISE 中的另一个 PS1 脚本调用 PowerShell 脚本 PS1

sql Powershell Migration工具http://stackingcode.com/blog/2011/10/12/database-migrations-with-powershel

嵌入 Powershell 脚本问题