我需要将逗号分隔值数组(.csv)转换为一些 JSON,如下所示:
"traits": {
"file": {
"content": "R0lGODlhABAQAIAAAAAAAP///yH7BAEAAAAALAAAAAAEAABAAAIBRAA5",
"file_name": "test.png"
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下内容:
$traits = New-Object PSObject
$file = New-Object PSObject
$file | Add-Member -Type NoteProperty -Name file_name -Value "file.csv"
$file | Add-Member -Type NoteProperty -Name content -Value $([Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes(($domain.GPOs | ConvertTo-Csv))))
$traits | Add-Member -Type NoteProperty -Name group-policies -Value $file
Run Code Online (Sandbox Code Playgroud)
看来“内容”的内容编码不正确。为了排除故障,我将内容复制到www.freeformatter.com/base64-encoder.html,发现它们不匹配。
我缺少什么?
编辑:这是 .csv 的内容。这是我粘贴到https://www.freeformatter.com/base64-encoder.html#ad-output的内容:
#TYPE Selected.System.Xml.XmlElement
"Name","GUID","Linked To","Computer Settings","User Settings"
"Autodiscover - Shared Namespace","249b1923-523a-40b6-9180-cc2727414b9b","@{OU Name=servers; OU Path=domain.local/location/servers; Enabled=true; Enforced=false}","@{Enabled=true; Settings=}","@{Enabled=true; Settings=}"
Run Code Online (Sandbox Code Playgroud)
Powershell 输出如下:
IwBUAFkAUABFACAAUwBlAGwAZQBjAHQAZQBkAC4AUwB5AHMAdABlAG0ALgBYAG0AbAAuAFgAbQBsAEUAbABlAG0AZQBuAHQAIAAiAE4AYQBtAGUAIgAsACIARwBVAEkARAAiACwAIgBMAGkAbgBrAGUAZAAgAFQAbwAiACwAIgBDAG8AbQBwAHUAdABlAHIAIABTAGUAdAB0AGkAbgBnAHMAIgAsACIAVQBzAGUAcgAgAFMAZQB0AHQAaQBuAGcAcwAiACAAIgBBAHUAdABvAGQAaQBzAGMAbwB2AGUAcgAgAC0AIABTAGgAYQByAGUAZAAgAE4AYQBtAGUAcwBwAGEAYwBlACIALAAiADIANAA5AGIAMQA5ADIAMwAtADUAMgAzAGEALQA0ADAAYgA2AC0AOQAxADgAMAAtAGMAYwAyADcAMgA3ADQAMQA0AGIAOQBiACIALAAiAEAAewBPAFUAIABOAGEAbQBlAD0AcwBlAHIAdgBlAHIAcwA7ACAATwBVACAAUABhAHQAaAA9AGQAbwBtAGEAaQBuAC4AbABvAGMAYQBsAC8AbABvAGMAYQB0AGkAbwBuAC8AcwBlAHIAdgBlAHIAcwA7ACAARQBuAGEAYgBsAGUAZAA9AHQAcgB1AGUAOwAgAEUAbgBmAG8AcgBjAGUAZAA9AGYAYQBsAHMAZQB9ACIALAAiAEAAewBFAG4AYQBiAGwAZQBkAD0AdAByAHUAZQA7ACAAUwBlAHQAdABpAG4AZwBzAD0AfQAiACwAIgBAAHsARQBuAGEAYgBsAGUAZAA9AHQAcgB1AGUAOwAgAFMAZQB0AHQAaQBuAGcAcwA9AH0AIgA=
Run Code Online (Sandbox Code Playgroud)
该网站吐出:
I1RZUEUgU2VsZWN0ZWQuU3lzdGVtLlhtbC5YbWxFbGVtZW50DQoiTmFtZSIsIkdVSUQiLCJMaW5rZWQgVG8iLCJDb21wdXRlciBTZXR0aW5ncyIsIlVzZXIgU2V0dGluZ3MiDQoiQXV0b2Rpc2NvdmVyIC0gU2hhcmVkIE5hbWVzcGFjZSIsIjI0OWIxOTIzLTUyM2EtNDBiNi05MTgwLWNjMjcyNzQxNGI5YiIsIkB7T1UgTmFtZT1zZXJ2ZXJzOyBPVSBQYXRoPWRvbWFpbi5sb2NhbC9sb2NhdGlvbi9zZXJ2ZXJzOyBFbmFibGVkPXRydWU7IEVuZm9yY2VkPWZhbHNlfSIsIkB7RW5hYmxlZD10cnVlOyBTZXR0aW5ncz19IiwiQHtFbmFibGVkPXRydWU7IFNldHRpbmdzPX0i
Run Code Online (Sandbox Code Playgroud) 我有一根绳子。有时它看起来像这样:
9xABp'}H9$G(@
虽然,有时它看起来像这样:
9xABp"}H9$G(@
我对用于生成字符串的字符集没有任何控制权,但我需要让 Powershell 停止抱怨无法解析字符串并为我提供所有字符。
$string = '9xABp'}H9$G(@'
$secure = ConvertTo-SecureString -String $string -AsPlainText -Force
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
Run Code Online (Sandbox Code Playgroud)
这不起作用,所以我尝试将字符串用双引号而不是单引号括起来。
$string = "9xABp'}H9$G(@"
$secure = ConvertTo-SecureString -String $string -AsPlainText -Force
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
Run Code Online (Sandbox Code Playgroud)
没关系,但是不包括 $G(用反斜杠替换),当我的字符串内部有双引号时怎么办?
我尝试使用 [Regex]::Escape()。
$string = "9xABp'}H9$G(@"
$secure = ConvertTo-SecureString -String ([Regex]::Escape($string)) -AsPlainText -Force
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
Run Code Online (Sandbox Code Playgroud)
但$G仍然失踪。另一次尝试,这次在外面加上双引号和单引号。
$string = "'9xABp'}H9$G(@'"
$secure = ConvertTo-SecureString -String ([Regex]::Escape($string)) -AsPlainText -Force
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
Run Code Online (Sandbox Code Playgroud)
我在这里能做什么?
我正在更新一些以前与 Selenium 3.141 一起使用的 PowerShell 代码。我有以下代码片段:
Add-Type -LiteralPath "$seleniumPath\lib\net48\WebDriver.dll"
Add-Type -LiteralPath "$seleniumPath\lib\net48\WebDriver.Support.dll"
$url = "https://<webpage.com>"
$options = New-Object OpenQA.Selenium.Chrome.ChromeOptions
$options.AddArgument("--disable-gpu")
$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($options)
[OpenQA.Selenium.Support.UI.WebDriverWait]$wait = New-Object OpenQA.Selenium.Support.UI.WebDriverWait ($driver, [System.TimeSpan]::FromSeconds(60))
$driver.Navigate().GoToURL($url)
$driver.FindElementById("username")
$wait.Until([OpenQA.Selenium.Support.UI.ExpectedConditions]::ElementExists([OpenQA.Selenium.By]::Id('username')))
Run Code Online (Sandbox Code Playgroud)
在 Selenium 4.0 中,FindElementById 不再起作用:
无法找到类型 [OpenQA.Selenium.Support.UI.ExpectedConditions]。
据我所知,OpenQA.Selenium.Support.UI.ExpectedConditions 存在于 WebDriver.Support 中,对吧?
寻找替代品,我发现了 SeleniumExtras.WaitHelpers,但这可能只适用于 .netstandard2.1?
我正在使用Invoke-WebRequest来获取HtmlWebResponseObject对象.当描述字段匹配特定字符串(在本例中为"server1")时,我想获取ID字段的值.Invoke-WebRequest返回了数百个结果(因此字符串超长)鉴于下面的示例,我将如何提取ID?
{"status":200,"data":[{"nextRecipient":0,"clearSent":true,"lastSentNotificationOn":0,"netscanVersion":"0","suppressAlertClear":"false","build" :"19000","lastSentNotificationOnLocal":"","id":6,"resendIval":15,"watchdogUpdatedOn":"2016-04-11 10:28:02 MDT","escalatingChainId":6,"description ":"domain\server1","ackComment":"","credential2":"","updatedOn":1460392096,"updatedOnLocal":"2016-04-11 10:28:16 MDT","agentConf": "product.code = {guid}\r \n#安装程序版本,不得修改\ r \n \ninstaller.version = 0001\r \n\r \n#由代理配置向导生成\ r \n \n \n \n \net = url\r \n \ncompany = company\r \nid = 6\r \n ncredential == cred\r \n\r \n#logger settings.将logger.size设置为0,对记录器大小没有限制,否则,大小限制为指定的Mbytes那个\ r \n \nlogger.output = console\r \n \nlogger.logfile =\r \n \nlogger.size = 64\r \n \nlogger.level = info\r \n\r \n#watchdog log level\r \nlogger.watchdog = info\r \n#为每个组件添加更详细的控件\ r \n#eg\r \n #logge r.level.controller = debug\r \n#\ r \n#如果没有设置,它将使用默认日志级别,即logger.level的值\ r \n#\ r \n\r \n#if …
我正在更新一些以前与 Selenium 3.141 一起使用的 PowerShell 代码。我有以下代码片段:
$url = "https://<webpage.com>"
$options = New-Object OpenQA.Selenium.Chrome.ChromeOptions
$options.AddArgument("--disable-gpu")
$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($options)
$driver.Navigate().GoToURL($url)
$driver.FindElementById("username")
Run Code Online (Sandbox Code Playgroud)
在 Selenium 4.0 中,FindElementById 不再起作用:
方法调用失败,因为 [OpenQA.Selenium.Chrome.ChromeDriver] 不包含名为“FindElementById”的方法
看看https://www.lambdatest.com/blog/what-is-deprecated-in-selenium4/,我发现这应该可以工作(在Java中):
driver.findElement(By.id("username"))
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将其转换为 PowerShell($driver.FindElement(By.id("username")) 不起作用)。
知道如何使用 PowerShell 和 Selenium 4 通过 ID(或类、xpath 等)查找元素吗?