Cod*_*ice 2 syntax powershell newline code-formatting
我怎么知道何时可以在Powershell脚本中使用New Lines/Carriage返回?搜索此答案时的所有搜索结果都指向输出.我不关心这种情况下的输出.我更感兴趣的是能够格式化我的Powershell脚本以提高可读性.
例如.下面是两个版本的Powershell命令行.一个工作,一个不工作.在这种情况下,命令的作用并不重要.关键是我需要知道什么时候我被允许创建一个新的行,而当我不是.
这个命令行工作,因为它只是一个很长的单行:
& 'C:\Program Files\ArangoDB3 3.3.3\usr\bin\arangoimp.exe' --file 'C:\Program Files\ArangoDB3 3.3.3\usr\bin\tstImportJSON.json' --type json --collection users --progress true --overwrite true --server.username root --server.password password
Run Code Online (Sandbox Code Playgroud)
由于脚本中间有一个新行,因此该命令行不起作用.
& 'C:\Program Files\ArangoDB3 3.3.3\usr\bin\arangoimp.exe' --file
'C:\Program Files\ArangoDB3 3.3.3\usr\bin\tstImportJSON.json'
--type json --collection users --progress true --overwrite true
--server.username root --server.password password
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我只是在添加换行符后运行相同命令行的不同版本,以查看它们是否有效.我知道在使用IF语句时我可以开始新行.在管道对象时我也可以使用新行.我的假设是,某处有一个Powershell脚本规则列表.当我最初开始进入Powershell时,我以为我曾经在某个地方看到过它们,但现在还没有任何线索.
可以使用`作为行继续符[1]
在最末端的线的,以跨多行传播它(甚至没有空格之后它允许).
这是一个简化的例子:
& cmd.exe /c echo `
hi `
there
Run Code Online (Sandbox Code Playgroud)
这相当于& cmd.exe /c echo hi there和收益率hi there.
注意:
由于`角色在视觉上是微妙的,并且语法很容易被意外地放置在其后面,所以考虑使用数组作为替代 - 见下文.
单个命令必须在一行上,因此`如果要将它们分布在多行中,则需要这些命令,如上所示.
但是,在一个管道中,您可以结束行|并继续下一行,而不需要`; 例如:
Get-Date | # Because the line ends with |, parsing continues on the next line.
Select-Object Day
Run Code Online (Sandbox Code Playgroud)此外,如果单个参数在表达式模式下创建一个新的解析上下文 - 例如一个固有的多行(...)表达式或一个{...}传递给cmdlet 的脚本块() - 您也可以自由地将表达式分布在多行中; 例如:
1, 2, 3 | ForEach-Object { # { starts a multiline-aware context
$_ + 1
}
Run Code Online (Sandbox Code Playgroud)甲混合情况下是一个阵列的文字说法,它允许你的内部元件的分解后的命令,分隔符:
Get-Date | Select-Object -Property Day,
Year
Run Code Online (Sandbox Code Playgroud)该语句开始在表达模式总是允许跨多个行扩频秒(虽然嵌入式命令方式陈述受通常的限制):
$foo = # an assignment is parsed in expression mode
'bar'
Run Code Online (Sandbox Code Playgroud)或者,考虑使用数组 [2]传递参数,这允许您使用多行表达式模式语法事先将参数定义为单个数组元素:
# Construct the array of arguments (using multiline expression syntax)...
$arguments = '/c',
'echo',
'hi there'
# ... and pass it to cmd.exe
& cmd.exe $arguments
Run Code Online (Sandbox Code Playgroud)
注意:Array元素由PowerShell hi there传递"hi there":它使用自动双引号来确保目标程序将参数识别为单个参数.
[1] `是PowerShell的通用转义字符.放置在一行的最后,它的功能略有不同:不是转义后面的换行符(这意味着保留它作为文字),它有效地告诉PowerShell 删除它并将下一行视为继续目前的一个.
[2]此答案的早期形式推荐基于阵列的泼溅,前PetSerAl指出,用于调用外部程序它是足够的原样使用数组.
虽然也可以使用splatting,但是如果其中一个数组元素是--%停止解析符号(简称:只有当splatting --%具有其特殊含义时),它的语义才会略有不同.但是,
在调用PowerShell命令时,Splatting是一种很有用的技术,主要是以哈希表的形式(参见前面的链接).