假设我们有一个对象数组$ objects.假设这些对象具有"名称"属性.
这就是我想要做的
$results = @()
$objects | %{ $results += $_.Name }
Run Code Online (Sandbox Code Playgroud)
这有效,但可以更好的方式完成吗?
如果我这样做:
$results = objects | select Name
Run Code Online (Sandbox Code Playgroud)
$results是具有Name属性的对象数组.我希望$ results包含一个Name数组.
有没有更好的办法?
我试图在PowerShell中使用LINQ.看起来这应该是完全可能的,因为PowerShell是建立在.NET Framework之上的,但我无法让它工作.例如,当我尝试以下(人为的)代码时:
$data = 0..10
[System.Linq.Enumerable]::Where($data, { param($x) $x -gt 5 })
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
无法找到"Where"和参数计数的重载:"2".
不要紧,这可以通过以下方式实现Where-Object.这个问题的关键不是找到在PowerShell中执行此操作的惯用方法.如果我可以使用LINQ,那么PowerShell中的一些任务将更轻松.
我想从存储在subversion中的脚本位置找到顶层的所有目录.
在C#中它会是这样的
Directory.GetDirectories(".")
.Where(d=>Directories.GetDirectories(d)
.Any(x => x == "_svn" || ".svn"));
Run Code Online (Sandbox Code Playgroud)
我在PowerShell中找到相当于"Any()"的东西有点困难,我不想经历调用扩展方法的尴尬.
到目前为止,我有这个:
Get-ChildItem | ? {$_.PsIsContainer} | Get-ChildItem -force | ? {$_.PsIsContainer -and $_.Name -eq "_svn" -or $_.Name -eq ".svn"
Run Code Online (Sandbox Code Playgroud)
这找到了我svn自己的目录,但不是他们的父目录 - 这就是我想要的.如果您能告诉我添加的原因,可以获得奖励积分
| Select-Object {$_.Directory}
Run Code Online (Sandbox Code Playgroud)
到该命令列表的末尾只显示一系列空行.
我有以下代码可行:
foreach ($db in $svr.Databases |
where-object {
$_.name -eq "testDB"
-or $_.name -eq "master"
-or $_.name -eq "model"
-or $_.name -eq "msdb" } )
{
write-output $db.name
}
Run Code Online (Sandbox Code Playgroud)
这是一个更干净的方法吗?
就像是:
foreach ($db in $svr.Databases |
where-object {$_.name -in "testDB, master, model, msdb" } )
{
write-output $db.name
}
Run Code Online (Sandbox Code Playgroud) 我是 powershell 脚本编写的新手。如果我错过了一些简单的事情,请道歉。
假设我有一个名为 的对象object,它有一个名为 的字段field。现在列出这些对象。
我如何获得相同顺序的字段列表?
在 python 中它将是:
list_of_objects = [o1, o2, o3]
list_of_fields = [i.field for i in list_of_object]
Run Code Online (Sandbox Code Playgroud) 我有一个 file1.txt,其中包含:
一号线
2号线
3号线
4号线
我想从 file1.txt 中删除存在于另一个 file2.txt 中的所有行:
线 3 线
2
结果应该是:
线 1
线 4
我尝试使用此命令,但仅当我在 file2.txt 中有一行时才有效:
Get-Content C:\file1.txt | Where-Object {$_ -notmatch $(get-content C:\file2.txt)}
Run Code Online (Sandbox Code Playgroud)
注意:我不想比较 2 个文件以查看它们是否相同。
任何的想法?我对 powershell 很陌生。
我有一个大约 10-15 列的数据文件,我想从中提取特定的列。有些列我知道确切的列标题,而其他列我只知道前两个字母将始终是“FC”。如何仅选择我知道列标题的列和以“FC”开头的列?从“FC”列开始,我尝试过这样的:
$myCSV = Import-CSV "mydata.txt" -Delimiter "`t"
$FCcols = $myCSV[0].psobject.Properties | foreach { $_.Name } | Where {$_ -match "FC"}
$myCSV | select $FCcols
Run Code Online (Sandbox Code Playgroud)
但我只是收到一个错误:
Select-Object : Cannot convert System.Management.Automation.PSObject to one of
the following types {System.String, System.Management.Automation.ScriptBlock}.
At line:3 char:16
+ $myCSV | select <<<< $FCcols
+ CategoryInfo : InvalidArgument: (:) [Select-Object], NotSupport
edException
+ FullyQualifiedErrorId : DictionaryKeyUnknownType,Microsoft.PowerShell.Co
mmands.SelectObjectCommand
Run Code Online (Sandbox Code Playgroud)
然后,如果我尝试:
$myCSV = Import-CSV "mydata.txt" -Delimiter "`t"
$FCcols = [System.Collections.ArrayList]@()
$myCSV[0].psobject.Properties | foreach { $_.Name } | Where …Run Code Online (Sandbox Code Playgroud) 这是我当前的脚本的样子:
$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file
Run Code Online (Sandbox Code Playgroud)
该文件的输出为:
@{LoadPercentage=4}
Run Code Online (Sandbox Code Playgroud)
我希望它只是数字,以便我进行计算。
使用 Windows 命令提示符或 Windows PowerShell,如何将单个目录中的所有文件名输出到文本文件,而不带文件扩展名?
在命令提示符中,我使用的是:
dir /b > files.txt
Run Code Online (Sandbox Code Playgroud)
01 - Prologue.mp3
02 - Title.mp3
03 - End.mp3
files.txt
Run Code Online (Sandbox Code Playgroud)
01 - Prologue
02 - Title
03 - End
Run Code Online (Sandbox Code Playgroud)
请注意,“dir /b > files.txt”命令包含文件扩展名并将文件名放在底部。
在不使用批处理文件的情况下,是否有一个干净的命令提示符或 PowerShell 命令可以完成我正在寻找的任务?
所以,我对 PowerShell 相当陌生,只是不知道如何使用数组/列表/哈希表。我基本上想做Python描述的以下事情:
entries = {
'one' : {
'id': '1',
'text': 'ok'
},
'two' : {
'id': '2',
'text': 'no'
}
}
for entry in entries:
print(entries[entry]['id'])
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
但这在 PowerShell 中是如何工作的呢?我尝试过以下方法:
$entries = @{
one = @{
id = "1";
text = "ok"
};
two = @{
id = "2";
text = "no"
}
}
Run Code Online (Sandbox Code Playgroud)
现在我不知道如何访问这些信息。
foreach ($entry in $entries) {
Write-Host $entries[$entry]['id']
}
Run Code Online (Sandbox Code Playgroud)
=> 错误
powershell ×10
arrays ×2
linq ×2
windows ×2
csv ×1
dictionary ×1
enumeration ×1
file ×1
hashtable ×1
logfile ×1
smo ×1
sql-server ×1