用于长字符串的Powershell脚本缩进

时间:2014-10-14 23:58:25

标签: powershell

这个问题不一定要以这种方式解决,但如果可以的话,它会为我节省很多宝贵的时间:

我一直在记录"排队"到日志文件。像这样:

$mylogentry = "A string of text containing information"
$mylogentry | out-file -append $log_file_path
$array_of_log_entries += $mylogentry

数组的原因是我将它们连接到Send-Message主体。

但是,当我有长引号时,我喜欢将它们划分为多行。我可以使用反击'`'字符。 我从未解决的是如果引用行嵌套在其他东西下,如何转义标签。在每次缩进之前使用反引号不会删除选项卡。

如果你看一下这样的网站:http://technet.microsoft.com/en-us/magazine/hh475841.aspx你会看到即使他鼓励缩进,他的代码也没有缩进参数。 (你实际上可以选中那些因为在引号之外忽略空格。也许他只是在说明一点)

这是我的意思的一个尝试的例子。 (注意我在SE上复制格式有困难.4空格缩进似乎不再创建代码块了)

if($somecondition){
   $mylogentry = "A string of really long text for non-technical people `
` ` continue to write text here. Additional info (technical): $techvar"

该字符串与人们之间存在很大差距'并且'继续'由于我的缩进。我当然可以继续'从第0列开始,但我的代码看起来更愚蠢。

4 个答案:

答案 0 :(得分:5)

你无法逃脱插入字符串的标签或空格;它们现在位于引号和字符串的一部分内(就此而言,换行符也是如此)。

您有几个选择:

  1. 根本不打破弦乐;任逍遥。显然不是你想做什么,但它确实有效。
  2. 使用@Matt的建议并连接字符串。只要引号在缩进后开始,你就没事了。
  3. 不要缩进下一行。这假设您确实希望换行符作为字符串的一部分。它可能看起来很混乱,但它将是a)可读而不滚动和b)功能。它看起来像这样:

    if ($fakeCondition) {
        if ($fauxCondition) {
            $longString = "Hello this string is too long 
    to be just one big line so we'll break it up into 
    some smaller lines for the sake of readability."
            # Code that uses the string
            Write-Host $longString
        }
    }
    
  4. 其他东西:使用一个数组,每行包含一个元素,然后加入它,或使用.NET的StringBuilder,但这些对于解决本质上是一种格式化烦恼来说太过分了。

    这里的字符串(使用@"开始一个字符串而"@结束它)将遇到与选项3相同的问题(行不能缩进或者标签/空格将嵌入到字符串)。

  5. 我的观点

    当我遇到这个长串污染代码的问题时,我通常会重新考虑嵌入字符串,或者我正在嵌入它们。

    我可能会将此功能分解为一个函数,然后接受该字符串作为参数(将问题推送到代码的不同部分,但它可能会有所帮助)。

    有时我会把它放在脚本顶部的here文档或长字符串中,然后再使用该变量。

    有时它意味着将这些字符串保存在单独的文件中并在运行时读取内容。

    一切都取决于具体情况。

答案 1 :(得分:3)

您会考虑使用字符串连接吗?

$test = "I would like to think that his is an example of a long string. Grammar aside I mean long as" +
            " in super long. So long even that I have to use lots of letters to get my message" +
            " across"

将输出以下内容:

I would like to think that his is an example of a long string. Grammar aside I mean long as in super long. So long even that I have to use lots of letters to get my message across

由于您使用+加入字符串,因此它会有效地忽略引用字符串之间的空白区域。


您可以将字符串存储为换行符分隔字符串,并在事后使用一点正则表达式进行清理。它的使用情况有限,但是如果你这么做很多而且braintists answer没有帮助......

$test = "I would like to think that his is an example of a long string. Grammar aside I mean long as
             in super long. So long even that I have to use lots of letters to get my message
             across" -replace "(?m)^\s+" -replace "`r`n"," "

因此它被输入为单个字符串。首先替换删除所有前导空格。第二个将所有换行更改为空格。两者都努力使它再次成为一个单一的灵魂。

答案 2 :(得分:3)

除了其他答案外,我还想分享一些选择。

加入子字符串数组(显式)

一元-join运算符

$singleLineText = -join @(
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
    "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
    "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
    "commodo consequat."
)

二进制-join运算符

$singleLineText = @(
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod"
    "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim"
    "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea"
    "commodo consequat."
) -join ' '

优点:

  • 不需要加号(+)或逗号(,)。
  • 轻松切换到多行字符串的二进制-join "`r`n"运算符。
  • 可以自由使用所需的缩进。

缺点:

  • 文本操作可能很麻烦。

加入子字符串数组(隐式)|避免

附加到一个空字符串。

$singleLineText = '' + @(
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod"
    "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
    "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo"
    "consequat."
)

管道到脚本块并使用$input-一个自动变量。

$singleLineText = @(
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod"
    "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
    "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo"
    "consequat."
) | & { "$input" }

只要将数组强制转换为字符串,就会[System.String]::Join(separator, array)方法被隐式应用。分隔符默认为“”(空格),可以通过设置$OFS-Ouptut Field Sperator特殊变量来覆盖。

优点:

  • 适用于连接管道输出。

缺点:

  • 缺乏明确性(出于几个原因),因此应尽可能避免。

此处字符串

$singleLineText = @"
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
"@ -replace "`r" -replace "`n", ' '

优点:

  • 适用于插入大片任意格式的预格式化文本(如源代码)。
  • 保留源缩进。
  • 无需转义引号。

缺点:

  • 对脚本格式不友好。
  • 很难跟踪尾随空格。

加法赋值运算符(+=

$s =  "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do ";
$s += "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad ";
$s += "minim veniam, quis nostrud exercitation ullamco laboris nisi ut ";
$s += "aliquip ex ea commodo consequat.";

优点:

  • 最明显,通用和众所周知的语法(在PowerShell之外)。
  • 大多数与编程语言无关的*。

*在某些编程语言中可能会违反变量命名约定。

缺点:

  • 文本操作可能很麻烦。

答案 3 :(得分:0)

$Message =  "Line 1`n" +
            "Line 2`n" +
            "Line 3`n"

Write-Output $Message

优点:

  • 所见即所得

缺点:

  • “加入可能会很累”(随您的直觉一起走-这会变得多么糟糕?_decision_required _)。