我使用Powershell的custom-object命令来保存数据点.自定义对象只创建一个对象并为其分配变量.Powershell可以更进一步,创建可以制作对象的新类吗?
在下面的示例中,我存储了三个数据:服务器名称,时间戳以及自服务器上发生事件以来的分钟数.
当我学习Powershell时,我把所有这些都放到了一个二维数组中:
$record = @("Server","Timestamp","Minutes")
for ($j = 0; $j -lt 10; $j++){
$record += @("Server1","$(get-date)",$j)
sleep 60
}
$record | export-csv -path c:\record.csv -no type information
Run Code Online (Sandbox Code Playgroud)
export-csv与数组不兼容,所以我开始使用自定义对象:
$record = @()
for ($j = 0; $j -lt 10; $j++){
$r = New-Object -TypeName PSObject
$r | Add-Member -MemberType NoteProperty -Name Server -Value ""
$r | Add-Member -MemberType NoteProperty -Name Timesteamp -Value ""
$r | Add-Member -MemberType NoteProperty -Name Minutes -Value ""
$r.server = "Server1"
$r.timestamp = "$(get-date)"
$r.minutes = …Run Code Online (Sandbox Code Playgroud) 我的Powershell(2.0)脚本包含以下代码段:
$fileName = "c:\reports\1.xlsx"
$xl = new-object -comobject excel.application
$xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault
$xl.displayalerts = $false
$workbook = $xl.workbooks.open($fileName)
#Code to manipulate a worksheet
$workbook.SaveAs($fileName, $xlformat)
$xl.quit()
$error | out-file c:\reports\error.txt
Run Code Online (Sandbox Code Playgroud)
我可以在Powershell命令提示符下运行此脚本,没有任何问题.电子表格会更新,error.txt为空.但是,当我在任务计划程序中将其作为任务运行时,我会在第一行出错.
使用"1"参数调用"打开"的异常:"Microsoft Office Excel无法访问文件'C:\ reports\1.xlsx'.有几个可能的原因:文件名或路径不存在.文件正在尝试保存的工作簿与当前打开的工作簿具有相同的名称.
我使用与Powershell命令提示符中运行脚本相同的凭据运行任务.当我手动运行脚本时,它可以打开,更新和保存电子表格而不会出现任何问题.当我在任务计划程序中运行它时,它无法访问电子表格.
有问题的文件对所有用户都是可读/可写的.我已经验证我可以使用相同的凭据在Excel中打开该文件.如果我创建一个新的电子表格并将其名称作为$ filename,我会得到相同的结果.我已经确认任务管理器中没有Excel.exe实例.
奇怪的是,如果我使用get-content,我没有任何问题.另外,如果我制作新的电子表格,我没有任何问题.
$fileName = "c:\reports\1.xlsx"
$xl = get-content $spreadsheet
$xl = new-object -comobject excel.application
$xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault
$xl.displayalerts = $false
# Commented out $workbook = $xl.workbooks.open($fileName)
$workbook = $xl.workbooks.add()
#Code to manipulate a worksheet
$workbook.SaveAs($fileName, $xlformat)
$xl.quit()
$error | out-file c:\reports\error.txt
Run Code Online (Sandbox Code Playgroud)
这很好.因此Get-ChildItem可以毫无问题地打开文件.如果我手动运行它,ComObject可以打开该文件,但如果它作为任务运行则不能.
我不知所措.有任何想法吗?
我编写了一个脚本来比较 redis 库中方法之间的查询速度。
据我了解,我不应该使用 redis.keys() 因为它是一个阻塞函数。首选方法是 scan_iter(),它不会阻塞。这就说得通了。但我不明白为什么 scan_iter 这么慢。
该脚本使用三种技术来查询 Redis 数据库。
选项 1 是迄今为止最快的。选项 2 的速度要慢 20 到 30 倍。选项 3 平均慢 4 倍。
为什么是这样?我的代码写错了吗?难道是我方法不对?redis.keys() 方法实际上是最佳选择吗?
from datetime import datetime
from time import sleep
import redis
r = redis.StrictRedis(host='192.168.3.16', port=6379, decode_responses=True, db= 0)
def query_keys():
start = datetime.now()
redis_keys = r.keys(pattern='*')
redis_keys = [x for x in redis_keys if not x.startswith('1_')]
values …Run Code Online (Sandbox Code Playgroud) 摘要: 在另一台计算机上运行“get-wmiobject”可以正常工作。但是当我“调用命令”“get-wmiobject”时,我的访问被拒绝。
详细信息:我在我们的中心站点有一个工作站(Computer-Central),我从中运行了一个清单脚本。库存脚本为我们所有远程站点上的每个 IP 循环执行多个“get-wmi”命令。如果我以域管理员身份登录 Computer-Central,脚本可以正常工作。
我现在在那些远程站点之一。我当前的工作站是 (Computer-SiteA)。所以我无法直接登录Computer-Central;我必须进入 RDP。问题是,RDP 会话在脚本完成之前超时(大约需要 12 小时)。所以我无法进入 RDP,启动脚本,然后走开。由于各种原因,制作计划任务也出来了。
Powershell 远程处理已启用。我使用域管理员帐户登录 Computer-SiteA 并运行以下命令:
invoke-command -computername Computer-Central {dir c:}
Run Code Online (Sandbox Code Playgroud)
这工作正常。因此,我使用以下命令启动了清单脚本(同样,在 Computer-SiteA 上以域管理员身份运行):
invoke-command -computername Computer-Central -filepath c:\inventory.ps1
Run Code Online (Sandbox Code Playgroud)
脚本启动并运行了一夜。但是 get-wmi 命令都产生了“拒绝访问”错误。我 RDP 进入 Computer-Central 并运行以下命令:
get-wmiobject -class win32_computersystem -property name -computername Computer-SiteB
Run Code Online (Sandbox Code Playgroud)
这工作正常。我得到了 WMI 信息。
然后我登录到 Computer-SiteA 并运行以下命令:
invoke-command -computername Computer-Central {get-wmiobject -class win32_computersystem -property name -computername Computer-SiteB}
Run Code Online (Sandbox Code Playgroud)
这因“拒绝访问”而失败。我以域管理员身份登录,甚至执行了“以不同用户身份运行”以确保 PS 控制台作为我的域管理员帐户打开。
我对此感到非常困惑。“调用命令”应该使用我在本地 PC 上使用的凭据在远程系统上启动 Powershell.exe 进程。“get-wmiobject”命令应该再次使用相同的凭据将 WMI 查询从远程 PC 传递到目标 PC。但情况似乎并非如此。
有任何想法吗?
编辑:我运行此命令是为了使计算机中心查询本身。
invoke-command -computername Computer-Central {get-wmiobject -class …Run Code Online (Sandbox Code Playgroud) 我正在使用PHP从MySQL数据库中查询CSS设置,然后将其回显到CSS样式表中.示例代码如下:
<?php
$connect = //connect string
$query = ($connect, "SELECT bgcolor, font FROM displays WHERE name = 'mySettings'");
while ($row = mysqli_query($query)){
$bgcolor = $row[bgcolor];
$font = $row[font];
}
echo '
body {
background-color: #'.$bgcolor.';
font: '.$font.';
}
';
?>
Run Code Online (Sandbox Code Playgroud)
表"displays"对于每个设置的CSS属性都有一列.每行代表用户保存的一组颜色/字体/填充/边距设置.
列"font"是数据类型varchar(50)."bgcolor"应该是什么数据类型?CSS希望看到十六进制值,但MySQL中没有十六进制数据类型.逻辑选择是将值存储为int类型并在SELECT语句中使用HEX()函数.
那么,是否可以更容易和/或使用更少的空间将其存储为char(6)?PHP只是作为字符串处理,而不是实际的数字.十六进制值不会应用任何数学函数; 它只是粘贴到CSS中.
在这种情况下,将值存储为int还是char之间是否有任何偏好?
我构建了一个 System.Xml.XmlDocument 类型的 XML 对象。
$scheme.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False XmlDocument System.Xml.XmlNode
Run Code Online (Sandbox Code Playgroud)
我使用 save() 方法将其保存到文件中。
$scheme.save()
Run Code Online (Sandbox Code Playgroud)
这将以带有 BOM 的 UTF-8 格式保存文件。BOM 会导致其他脚本出现问题。
当我们在 Notepad++ 中打开 XML 文件并将其保存为 UTF-8(不含 BOM)时,其他脚本不会出现问题。所以我被要求保存没有 BOM 的脚本。
保存方法的 MS 文档指出:
编码属性的值取自 XmlDeclaration.Encoding 属性。如果 XmlDocument 没有 XmlDeclaration,或者 XmlDeclaration 没有编码属性,则保存的文档也不会具有编码属性。
XmlDeclaration 上的 MS 文档列出了 UTF-8、UTF-16 等的编码属性。它没有提到 BOM。
XmlDeclaration 是否具有省略 BOM 的编码属性?
附言。此行为在 Powershell 5 和 Powershell 7 中是相同的。
我正在学习Java,现在正在学习JDBC。我认为我对如何使用结果集对象有一定的了解,但我想确保自己做得对。
请参见下面的代码。它在名为“ restaurant”的数据库中查询名为“ menu”的表。该表有四列:
这是menuItem对象的Java代码。表中的每一行都应用于创建menuItem对象:
public class menuItem {
public int id = 0;
public String descr = "";
public Double price = 0.0;
public String name = "";
public menuItem(int newid, String newdescr, Double newprice, String newname){
id = newid;
descr = newdescr;
price = newprice;
name = newname;
}
}
Run Code Online (Sandbox Code Playgroud)
一切都是公开的,只是为了简化此练习。
这是填充数据库的代码。目前,此代码是主类内部的方法。
public static ArrayList<menuItem> reQuery() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException{
ArrayList<menuItem> mi = new ArrayList<menuItem>();
//Step 1. …Run Code Online (Sandbox Code Playgroud) 摘要:Java选项“ Djavax.net.ssl.trustStoreType = WINDOWS-ROOT”允许Java将Windows信任存储区用于计算机帐户。可以使用什么选项将Windows信任存储区用作用户帐户?
我们有一个在Windows客户端上运行的Java应用程序。该应用程序从各种来源获取数据,其中一些来源使用默认cacerts文件中没有的证书。
当用户选择访问外部数据的项目时,系统会提示他们下载外部站点的证书。由于我们的安全设置,cacerts文件对于用户是只读的。由于JRE无法将证书导入到cacerts中,因此不会下载外部文件。并提示用户反复下载证书。
当授予用户对cacerts的写入权限时,不会发生此问题。但是我们的安全团队不会让我们向普通用户授予对该文件的写入权限。他们的政策是,用户自己的配置文件之外的C:驱动器上的任何文件都不应读写。
我们认为我们找到了一种解决方法,可以使Java使用Windows信任库。我们在启动脚本中添加了标志“ Djavax.net.ssl.trustStoreType = WINDOWS-ROOT”。这迫使Java使用Windows信任存储,用户可以对其进行写入。
不幸的是,用户只能写入其证书存储区,而不能写入计算机的证书存储区。当我们以管理员身份运行该应用程序时,证书将导入到计算机的存储中。此后,不提示普通用户下载证书。但是,如果我们不使用管理员权限一次运行该证书,则不会导入该证书,因为Java尝试写入Windows 计算机帐户存储,该帐户与cacerts一样被严格锁定。
是否有一个标志可以强制Java使用整个Windows信任存储,而不仅仅是计算机帐户的存储?
Powershell"add-member"命令非常有用.我用它来为自定义对象添加属性.有时我将一个成员设置为一个数组来保存多个对象.是否可以在自定义对象上添加ArrayList作为成员?
想象一下,文章列表中包含"索引","标题"和"关键字"属性.在Powershell中,您可以将此代码放在循环中:
for($i = 0; $i -lt 100; $i++) {
$a = new-object -TypeName PSObject
$a | Add-Member -MemberType NoteProperty -Name index -Value $i
$a | Add-Member -MemberType NoteProperty -Name title -Value "Article $i"
$a | Add-Member -MemberType NoteProperty -Name keywords -Value @()
$articles += $a
}
Run Code Online (Sandbox Code Playgroud)
你最终会得到一个Article对象的数组文章,每个对象都包含成员索引,标题和关键字.此外,关键字成员是一个可以有多个条目的数组:
$articles[2].keywords += "Stack Exchange", "Powershell", "ArrayLists"
$articles[2].keywords[2]
Powershell
Run Code Online (Sandbox Code Playgroud)
这满足了我的大部分需求,但我不喜欢处理数组.如果只是因为,ArrayLists更容易使用
$arrayList1.remove("value")
Run Code Online (Sandbox Code Playgroud)
比直觉更直观
$array1 = $array1 |? {$_ new "value"}
Run Code Online (Sandbox Code Playgroud)
Add-Member是否有办法将ArrayList添加为成员?还是我坚持阵列?如果Powershell不支持,那么我可以使用一些C#代码来创建一个以ArrayList为成员的新类吗?
我正在使用"Get-Winevent"cmdlet过滤事件日志条目.我想获得级别小于4的事件(或者LevelName不是"信息"的事件).
我使用-filterhashtable标志来过滤事件.但有没有办法与filterhashtable进行比较?或者只是把"不"?或者filterhashtable只接受"="作为运算符?
这两个片段起作用并得到相同的结果:
其中,对象
$events = Get-WinEvent -computer ServerName -LogName System | Where-Object {$_.level -lt 4}
Run Code Online (Sandbox Code Playgroud)
-filterhashtable
$events = Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level = 1}
$events += Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level = 2}
$events += Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level = 3}
Run Code Online (Sandbox Code Playgroud)
第二个片段比第一个片段运行得快得多(2分钟对比16秒).据我了解,"where-object"必须等到"Get-WinEvent"获得每个事件对象(可能是数千个).添加"-filterhashtable"会导致目标系统的事件日志在提供事件对象Get-WinEvent之前进行过滤,这样会快得多.
我可以结合这些陈述吗?这些片段不起作用:
$events = Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level < 4}
$events = Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level != 2}
Run Code Online (Sandbox Code Playgroud)
"Level"属性的类型为"int …
我有一个(纯文本)日志文件,其中的日期出现在大多数(但不是全部)文本行中。日期并不总是出现在每行的相同位置。尽管并非所有行都有日期,但在任何给定的 10 行集合中总会有一个日期。日志示例:
03/05/2019 Event A occurred
03/05/2019 Event B occurred
Event B Details: Details Details
03/07/2019 Event C occurred
Logging completed on 03/08/2019
03/08/2019 Event D occurred
Run Code Online (Sandbox Code Playgroud)
我需要获取最后记录的项目的日期。我不需要该行的内容,只需要该行中的日期。
#Get the log file. Tail it because it's huge. The regex pattern matches date format dd/mm/yyyy.
$log = (Get-Content -tail 10 C:\mylog.log | Select-String -Pattern "\d{2}/\d{2}\/d{4}"
#Get the last item in the $log variable. Convert it to a string.
$string = $log[-1].toString()
#Split the string. Match each element to a date …Run Code Online (Sandbox Code Playgroud)