如何将一块脚本写入另一个脚本?

时间:2016-08-11 20:05:23

标签: powershell

我正在尝试编写一个编写PowerShell配置文件的脚本。这对于想要一个能够自动化他们日常工作的配置文件的新用户非常有用。

我试图找出如何将大量脚本与各种对象一起使用,然后将其写入之前只有几行的配置文件中。

我遇到的问题是我试图将一大块脚本变成一个字符串,然后可以将其写入该配置文件。

一个例子:

$text='"welcome, want to go to site?"

$goyn=read-host -prompt "enter y or n"

if($goyn -eq 'y'){
start 'www.google.ca'
}
else{"continue on your journey of awesomeness"}


Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-WmiObject -Class Win32_OperatingSystem -ComputerName localhost |
Select-Object -Property CSName,@{n="Last Booted";
e={[Management.ManagementDateTimeConverter]::ToDateTime($_.LastBootUpTime)}}'

我尝试将它放在单引号之间,然后将其传递给变量,但无济于事。

2 个答案:

答案 0 :(得分:1)

它并不完全清楚你在问什么,但听起来你的引用有问题。您可以使用here-strings作为Patrick Meinecke建议。看起来像这样:

$text=@'
"welcome, want to go to site?"

$goyn=read-host -prompt "enter y or n"

if($goyn -eq 'y'){
start 'www.google.ca'
}
else{"continue on your journey of awesomeness"}


Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-WmiObject -Class Win32_OperatingSystem -ComputerName localhost |
Select-Object -Property CSName,@{n="Last Booted";
e={[Management.ManagementDateTimeConverter]::ToDateTime($_.LastBootUpTime)}}
'@

你可以做的另一件事就是自然地使用[ScriptBlock]。这也为您提供了编辑器中语法高亮和标签完成的好处。

$sb = {
    "welcome, want to go to site?"

    $goyn=read-host -prompt "enter y or n"

    if($goyn -eq 'y'){
    start 'www.google.ca'
    }
    else{"continue on your journey of awesomeness"}


    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    Get-WmiObject -Class Win32_OperatingSystem -ComputerName localhost |
    Select-Object -Property CSName,@{n="Last Booted";
    e={[Management.ManagementDateTimeConverter]::ToDateTime($_.LastBootUpTime)}}
}

您可以将脚本块直接传递给Set-Content

Set-Content -Path C:\my\profile.ps1 -Value $sb

但是如果你想确定你得到一个字符串(也许并非所有的cmdlet都是宽容的),只需在脚本块上调用.ToString()

$text = $sb.ToString()

答案 1 :(得分:1)

正如Patrick Meinecke在评论中所说,这听起来像是字符串是你想要的。

Here-Strings可以更轻松地创建一个包含多个引用级别,多行等的文本字符串,而无需进行一堆转义,最终会看到一堆杂乱无章的代码。

如果您希望保存文本就像您编写的一样,您可以这样做:

$text = @'
"welcome, want to go to site?"

$goyn=read-host -prompt "enter y or n"

if($goyn -eq 'y'){
start 'www.google.ca'
}
else{"continue on your journey of awesomeness"}


Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-WmiObject -Class Win32_OperatingSystem -ComputerName localhost |
Select-Object -Property CSName,@{n="Last Booted";
e={[Management.ManagementDateTimeConverter]::ToDateTime($_.LastBootUpTime)}}
'@

here-string以@开头,以@结尾。如果使用双引号,则会扩展变量,但如果使用单引号(如上例所示),则不会扩展变量。