长字符串的Powershell脚本缩进

BSA*_*AFH 5 powershell

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

我一直在“一次记录”到一个日志文件。像这样:

$mylogentry = "A string of text containing information"
$mylogentry | out-file -append $log_file_path
$array_of_log_entries += $mylogentry
Run Code Online (Sandbox Code Playgroud)

数组的原因是我将它们加入了一个Send-Message正文中。

但是,当我有长引号时,我喜欢将它们分开。我可以使用反引号'`'来实现。我从来没有想过如果引号行嵌套在其他内容下,如何转义制表符。在每个缩进之前使用反引号不会删除该选项卡。

如果您浏览这样的网站:http : //technet.microsoft.com/zh-cn/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"
Run Code Online (Sandbox Code Playgroud)

由于我的缩进,该字符串在“人”和“继续”之间会有很大的差距。我当然可以从第0列开始“继续”,但是然后我的代码看起来更加愚蠢。

bri*_*ist 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
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 其他内容:对每行使用一个元素包含一个数组,然后将其加入,或使用.NET的数组StringBuilder,但这些对于解决本质上对格式化造成的烦恼是过大的。

    在这里,字符串(@"用于开始和"@结束字符串)将具有与选项3相同的问题(行不能缩进,或者制表符/空格将嵌入在字符串中)。

我的看法

当我遇到长字符串污染代码的问题时,我通常会开始重新考虑将字符串嵌入或将其嵌入的地​​方。

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

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

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

一切都取决于情况。


Dmi*_*ork 5

I'd like to share some options in addition to other answers.

Joining array of substrings (explicit)

Unary -join operator

$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."
)
Run Code Online (Sandbox Code Playgroud)

Binary -join operator

$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 ' '
Run Code Online (Sandbox Code Playgroud)

Pros:

  • No plus signs (+) or commas (,) needed.
  • Easy switch to binary -join "`r`n" operator for multiline string.
  • Free to use desired indentations.

Cons:

  • Text manipulations can be tiresome.

Joining array of substrings (implicit) | avoid

Appending to an empty string.

$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."
)
Run Code Online (Sandbox Code Playgroud)

Piping to script block and using $input - an automatic variable.

$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" }
Run Code Online (Sandbox Code Playgroud)

Whenever an array is coerced into a string, [System.String]::Join(separator, array) method is applied implicitly. Where the separator is " " (space) by default, and can be overwritten by setting $OFS - the Ouptut Field Sperator special variable.

Pros:

  • Suited for joining pipe output.

Cons:

  • Lack of clarity (for several reasons), thus should be avoided whenever possible.

Here-string

$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", ' '
Run Code Online (Sandbox Code Playgroud)

Pros:

  • Good for drop-in big sheets of arbitrary preformatted text (like source code).
  • Preserves source indentations.
  • No need to escape quotes.

Cons:

  • Not friendly to script formatting.
  • Can be hard to keep track of trailing white-spaces.

The addition assignment operator (+=)

$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.";
Run Code Online (Sandbox Code Playgroud)

Pros:

  • Most obvious, universal and well-known syntax (outside of PowerShell).
  • Mostly programming language agnostic *.

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

缺点:

  • 文本操作可能很麻烦。