如何在PowerShell中使用内联If(IIf,另请参阅:http://en.wikipedia.org/wiki/IIf或ternary If)创建一个语句?
如果您还认为这应该是本机PowerShell功能,请将其投票:https://connect.microsoft.com/PowerShell/feedback/details/1497806/iif-statement-if-shorthand
从文件中加载PowerShell哈希表的问题?记录如何将包含PSON格式的哈希表的文件加载到变量中,但是如何将哈希表保存为PSON格式的文件?
哈希表:
@{
"name" = "report 0"
"parameters" = @(
@{"name" = "parameter 0"; "default" = 1; "values"=1,2,3,4},
@{"name" = "parameter 1"; "default" = 'A'; "values" = 'A','B','C'}
)
}
Run Code Online (Sandbox Code Playgroud) 为什么我得到意想不到的ConvertTo-Json
结果?
为什么往返($Json | ConvertFrom-Json | ConvertTo-Json
)失败?
Stackoverflow有一个很好的机制来防止重复的问题,但是据我所知,还没有一种机制可以防止有重复原因的问题。以这个问题为例:几乎每个星期都有一个新的原因相同的问题出现,但是通常很难将其定义为重复问题,因为问题本身只是稍有不同。不过,如果这个问题/答案本身最终以重复(或题外话)结尾,我不会感到惊讶,但是不幸的是stackoverflow无法写一篇文章来防止其他程序员继续写这个“已知”陷阱引起的问题。
具有相同共同原因的类似问题的一些示例:
那么,这个“自我回答”的问题是否与上述重复的问题有所不同?
它具有标题中的常见原因,因此可以更好地防止由于相同原因而重复问题。
我正在使用Powershell 4并尝试将存档的事件日志解析为包含所有数据的csv文件,并且具有与之关联的标头.我能够得到的最接近的是使用以下命令:
Get-WinEvent -Path .\Security.evtx |Select-Object TimeCreated, ProviderName, Id, Message, Level, Keyword, UserID, Data, Subject, SubjectUserSid, SubjectUserName, SubjectLogonId, ComputerName | Export-Csv .\Logging.csv
Run Code Online (Sandbox Code Playgroud)
这为我提供了csv文件中所有字段的所有标题信息,但是包含数据的唯一字段是TimeCreated,ProviderName,ID,Level和Message.我正在尝试将缺少的数据放入列中但不成功.那么我在这里做错了什么?
对于我的爱好项目ConvertTo-Expression
,我希望我的 cmdlet(默认情况下)的输出表达式符合约束语言模式。为此,我可能会包含一个带有 Allowed Types的硬编码列表:
$AllowedTypes = # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_language_modes?view=powershell-7
[Array],
[Bool],
[byte],
[char],
[DateTime],
[decimal],
...
Run Code Online (Sandbox Code Playgroud)
但我宁愿自动从 PowerShell 本身检索允许类型的列表,知道这将是最新版本(例如,该[Ordered]
类型未在网站上列出,但似乎在受限语言模式下是允许的)。
有没有办法做到这一点?
或者:
如何检查(在完整语言模式下)特定类型是否符合受限语言模式?
我有一个简单的批处理脚本将多个csv文件复制到一个csv中,我似乎无法找到一种方法在PowerShell中以相同的速度执行相同的操作.批处理它是这样的:
复制"*.csv"Merged.csv
它只需几秒钟即可将大约20个3MB csv复制到一个文件中.
在powershell中,我最接近的是:
dir*.csv | Import-Csv | Export-Csv allsites.csv -NoTypeInformation
这种方法需要很长时间.在PowerShell中是否有一个方法可以与上面的DOS命令相媲美?
由于使用PowerShell表达模式,PowerShell提供了一些不错的方法来反序列化对象,例如:
Invoke-Expression
小命令Invoke-Command
小命令&
我的一般期望是,给定表达式的结果应与在该表达式的相同序列化版本上使用上面列出的反序列化命令之一相同(有关背景,请参见“在PowerShell中保存哈希表”上的ConvertTo-Expression答案对象符号(PSON)问题)。
换一种说法:
<Expression> <=> Invoke-Command {<Expression>} <=> &([ScriptBlock]::Create('<Expression>'))
<Expression> <=> Invoke-Expression '<Expression>'
Run Code Online (Sandbox Code Playgroud)
例子:
Get-ChildItem <=> &{Get-ChildItem}
Get-ChildItem <=> Invoke-Command {Get-ChildItem}
Get-ChildItem <=> Invoke-Expression 'Get-ChildItem'
1, 2, 3 <=> &{1, 2, 3}
1, 2, 3 <=> Invoke-Command {1, 2, 3}
1, 2, 3 <=> Invoke-Expression '1, 2, 3'
Run Code Online (Sandbox Code Playgroud)
对于几乎每个表达式而言,确实确实存在这种情况,但是由于PowerShell默认情况下会展开(枚举)输出,因此在表达式包含具有单个项目的数组的情况下,此定义会有所不同:
,1 <?> Invoke-Command {,1}
,1 <?> Invoke-Expression ',1'
,"Test" <?> Invoke-Command {,"Test"}
,"Test" <?> Invoke-Expression …
Run Code Online (Sandbox Code Playgroud) @Ansgar Wiechers 最近对 PowerShell 问题的评论再次触动了我的心:DO NOT use Invoke-Expression
关于一个安全问题,我长期以来一直在脑海中思考,需要问一下。
强烈的声明(参考Invoke-Expression 被认为是有害的文章)表明,调用可以覆盖变量的脚本被认为是有害的。
另外,PSScriptAnalyzer建议不要使用Invoke-Expression
,请参阅避免使用InvokeExpression 规则。
但我自己曾经使用过一种技术来更新递归脚本中的公共变量,该变量实际上可以覆盖其任何父级作用域中的值,就像这样简单:
([Ref]$ParentVariable).Value = $NewValue
Run Code Online (Sandbox Code Playgroud)
据我所知,潜在的恶意脚本也可以使用这种技术在任何情况下注入变量,无论它是如何调用的......
考虑以下“恶意”Inject.ps1
脚本:
([Ref]$MyValue).Value = 456
([Ref]$MyString).Value = 'Injected string'
([Ref]$MyObject).Value = [PSCustomObject]@{Name = 'Injected'; Value = 'Object'}
Run Code Online (Sandbox Code Playgroud)
我的Test.ps1
脚本:
$MyValue = 123
$MyString = "MyString"
$MyObject = [PSCustomObject]@{Name = 'My'; Value = 'Object'}
.\Inject.ps1
Write-Host $MyValue
Write-Host $MyString
Write-Host $MyObject
Run Code Online (Sandbox Code Playgroud)
结果:
456
Injected string
@{Name=Injected; Value=Object}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,Test.ps1
作用域中的所有三个变量都被脚本覆盖Inject.ps1
。这也可以使用 …
StackOverflow 站点的问答中+=
经常使用递增赋值运算符 ( )[PowerShell]
来构造集合对象,例如:
$Collection = @()
1..$Size | ForEach-Object {
$Collection += [PSCustomObject]@{Index = $_; Name = "Name$_"}
}
Run Code Online (Sandbox Code Playgroud)
然而,它似乎是一种非常低效的操作。
一般情况下,+=
在 PowerShell 中构建对象集合时应该避免使用递增赋值运算符 ( ) 是否可以?
在我们公司,我是个新人,他们几乎为每个 Native PowerShell cmdlet 都有一个包装器,主要是为了添加更多日志记录和错误处理。我试图反驳这一点,并参考内部 PowerShell 功能来创建一个代理命令,例如:
$GCI = Get-Command Get-ChildItem
[System.Management.Automation.ProxyCommand]::Create($GCI)
Run Code Online (Sandbox Code Playgroud)
但我在这里缺乏一些知识。
SteppablePipeline 和使用本机 PowerShell 语法之间有什么区别(如果有)。
换句话说,在Process
块中,有什么区别:
$steppablePipeline.Process($_)
Run Code Online (Sandbox Code Playgroud)
并使用本机 PowerShell 语法:
$_ |Microsoft.PowerShell.Management\Get-ChildItem # In this example
Run Code Online (Sandbox Code Playgroud)
我知道我正在寻找一般信息,但在我看来,几乎没有任何关于例如ScriptBlock.GetSteppablePipeline
方法的信息
powershell ×10
expression ×3
collections ×1
csv ×1
depth ×1
iif ×1
json ×1
merge ×1
parsing ×1
pipeline ×1
unroll ×1