我能够找到如何GetInvalidFileNameChars()在PowerShell脚本中使用该方法.但是,它似乎也过滤掉了空白(这是我不想要的).
编辑:也许我不是很清楚地问这个问题.我希望下面的函数包含文件名中已存在的空格.目前,脚本过滤掉空格.
Function Remove-InvalidFileNameChars {
param([Parameter(Mandatory=$true,
Position=0,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[String]$Name
)
return [RegEx]::Replace($Name, "[{0}]" -f ([RegEx]::Escape([String][System.IO.Path]::GetInvalidFileNameChars())), '')}
Run Code Online (Sandbox Code Playgroud) dev是我的根目录。我有以下文件。
dev\sitehealthcheck\test.py
dev\sitehealthcheck\draw.py
Run Code Online (Sandbox Code Playgroud)
在test.py中,第一行内容如下:
from sitehealthcheck.draw import *
Run Code Online (Sandbox Code Playgroud)
如果我在 VSCode 终端中运行test.py ,一切都会按预期运行。但是,当我尝试在交互式窗口中执行test.py时,Jupyter 返回:
ModuleNotFoundError:没有名为“sitehealthcheck”的模块
我该怎么做才能让 VSCode 自动在与我正在执行的文件相同的目录中搜索模块?
我更愿意只输入以下行..并且让 VSCode 编辑器/Intellisense 和 Jupyter 自动搜索与我正在执行的文件相同的目录中的模块。
from draw import *
Run Code Online (Sandbox Code Playgroud) 我有一个工作的PowerShell 3.0脚本,它利用Invoke-WebRequest发布表单并保存相应的原始HTML输出.不幸的是,该脚本不适用于仅使用PowerShell 2.0的工作站.
我希望有人可以帮助转换下面的脚本以使用PowerShell 2.0(无需安装PS模块,软件包或升级PowerShell).看起来我需要使用.NET webclient,但我还没有足够的经验来做到这一点.一个工作示例(基于我的脚本)将非常感谢!
PS:我sls -pattern用来过滤掉原始HTML输出中的内容.如果有一种更可靠的方法来识别原始输出中的某些项目,我不介意看一个例子.
$UserAgent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET CLR 1.1.4322; InfoPath.3; MS-RTC LM 8; .NET4.0E)'
$r=Invoke-WebRequest -Uri 'http://web.ourwebserver.com/test.aspx' -UseDefaultCredentials -SessionVariable WebSession
$form = $r.Forms[0]
$fields = Invoke-WebRequest -Uri 'http://web.ourwebserver.com/test.aspx' -WebSession $WebSession | select -ExpandProperty inputfields | select name, value
$viewstate = $fields | ?{$_.name -match "VIEWSTATE"} | select -ExpandProperty value …Run Code Online (Sandbox Code Playgroud) 我正在尝试自动提交 Web 表单(主要作为更好地学习 Powershell 的练习)。
我做的第一件事是使用 Fiddler2 查看发送的确切 Web 表单字段(以及相应的值)(使用常规 Web 浏览器提交数据)。
然后,我在下面的 Powershell 脚本中重新创建了在 Fiddler 的 WebForm 选项卡中看到的所有可能的字段和值;我包括了 __VIEWSTATE、__EVENTVALIDATION (以及我从网络会话开始时获取的它们的值)。我包含了没有值的字段(与我在 fiddler 中看到的相同)。我什至包含了提交按钮(因为我也在 Fiddler 中看到了这个按钮)。
不幸的是,在我使用我的脚本发布所有字段之后;当我查看 $response.rawcontent (如下面的脚本所示)时,它仍然位于我开始时的同一个网页上。如果我使用网络浏览器提交表单,它会使用新信息更新页面。我想知道我做错了什么或遗漏了什么。我最初尝试在不包含任何以 __ 开头的字段的情况下发布表单,但是,这不起作用。
PS:通过网络浏览器提交表单时,我还有两个字段呈灰色(并用我的姓名和电子邮件地址填写)。然而,有趣的是,我在 Fiddler 中没有看到这两个字段。我猜它们可能是通过 __VIEWSTATE 或 __EVENTVALIDATION 编码数据提交的?
非常感谢你对我的帮助!
$UserAgent = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'
$r=Invoke-WebRequest -Uri 'http://website.com/RTR/xl/requestform.aspx' -UseDefaultCredentials -SessionVariable RequestForm
$fields = Invoke-WebRequest -Uri 'http://website.com/RTR/xl/requestform.aspx' -WebSession $RequestForm | select -ExpandProperty inputfields | select name, value
$viewstate = $fields | ?{$_.name -match "VIEWSTATE"} | select -ExpandProperty value …Run Code Online (Sandbox Code Playgroud) 我创建了一个powershell脚本,它使用GetForegroundWindow()来识别哪个Window是当前聚焦的Window.不幸的是,当执行powershell脚本时(通过Windows任务计划程序或热键),脚本会窃取当前前台应用程序的焦点; 错误地使用Powershell窗口本身作为Foreground应用程序,而不是预期的前台应用程序.
我甚至尝试使用PS2EXE"-noconsole"设置创建一个EXE; 但是,脚本仍然不起作用.
有人可以建议一种方法来执行这个脚本而不改变当前前景窗口的焦点吗?
我的脚本代码在测试期间工作(仅当我添加"Start-Sleep -s 5"时;并且,使用alt-tab手动窃取焦点,以便脚本识别正确的前景窗口.
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
}
"@
function Set-WindowStyle {
param(
[Parameter()]
[ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE',
'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED',
'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')]
$Style = 'SHOW',
[Parameter()]
$MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle
)
$WindowStates = @{
FORCEMINIMIZE = 11; HIDE = 0
MAXIMIZE = 3; MINIMIZE = 6
RESTORE = 9; SHOW = 5
SHOWDEFAULT = 10; SHOWMAXIMIZED = …Run Code Online (Sandbox Code Playgroud) 目前,我可以访问: https://files.mydomain.com/files。即使我去https://files.mydomain.com,它也会自动重定向到https://files.mydomain.com/files成功。
相反,我希望 NGINX 自动重写https://files.mydomain.com/files->https://files.mydomain.com
我当前的 NGINX 代码:
http {
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name files.mydomain.com;
location / {
return 301 https://files.mydomain.com$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name files.mydomain.com;
client_max_body_size 0;
location / {
return 301 https://$host/files;
}
location /files {
proxy_pass http://localhost:89;
}
}
#Root Domain
server {
listen 443 ssl http2;
listen [::]:443 …Run Code Online (Sandbox Code Playgroud) 有人可以告诉我如何在以下情况下避免这个错误?
$codegenDir = "Z:\Desktop\Song-Renamer"
$PowerShellRepresentation = dir -path $MyMusicFolder -recurse -include *.mp3,*.m4a,*.wma,*.flac,*.ape | select -ExpandProperty FullName | $codegenDir\codegen.exe -s 10 20 | Out-String | ConvertFrom-Json
Run Code Online (Sandbox Code Playgroud)
令我完全困惑的是,如果简单地省略$ codegenDir(见下文),代码就能正常运行.我"想"我理解首先放置表达式的概念(在管道中的其他项目之前.但我不确定如何重新排列/拆分此代码,因此有问题的表达式Codegen.exe外部命令行是第一项在管道中(并且仍然能够通过管道将数据传递给它).
$PowerShellRepresentation = dir -path $MyMusicFolder -recurse -include *.mp3,*.m4a,*.wma,*.flac,*.ape | select -ExpandProperty FullName | .\codegen.exe -s 10 20 | Out-String | ConvertFrom-Json
Run Code Online (Sandbox Code Playgroud)
理想情况下,使用尽可能少的代码执行此操作会很好.
我可以使用以下代码将程序固定到 Windows 10 任务栏(感谢这个StackOverflow 问题)。但是,如果我尝试向程序添加命令行参数,如下例所示,它不起作用。代码似乎假定目标可执行文件没有任何参数。
$Target = "`"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe`" --proxy-server=192.168.1.2:8080"
Run Code Online (Sandbox Code Playgroud)
$Target = "`"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe`" --proxy-server=192.168.1.2:8080"
Run Code Online (Sandbox Code Playgroud) 我还在学习Powershell; 而且,意识到它的设计非常简单.但是,我很尴尬地说我无法找到一个简单的方法来使用PowerShell cmdlet执行下面的dos复制命令(最简单的方法).似乎副本项目不太喜欢通配符.我试过的东西最终变得过于复杂; 并且,仍然没有做我真正想要它做的事情.
复制*.ps1*.ps1.bak/y
我能够从 MySql 查询填充数据表 $devices (例如):
PS C:\Users\MKANET\Desktop\dev\lab> $devices.table[10]
name ip mac vendor
---- -- --- ------
ComputerTest 10.51.18.6 fd1969ff4cb9 HewlettP
Run Code Online (Sandbox Code Playgroud)
我想将该数据表类型转换为自定义 PSObject;其中,mac 列转换为 PSObject NoteProperty 名称“Mac-Address”;并且,将各个值转换为 00-00-00-00 字符串格式:
PS C:\Users\MKANET\Desktop\dev\lab> $devices[1]
name ip MAC-Address vendor
------- -- ----------- ------------
ComputerTest 10.51.18.6 fd-19-69-ff-4c-b9 HewlettP
Run Code Online (Sandbox Code Playgroud)
考虑到这些数据表可能相对较大(可能有几百行),我需要最快的处理方法在Powershell中执行此操作。
如果它会使转换/修改过程显着加快,我很乐意将 $Devices 保留为数据表;仅将“mac”列的值修改/处理为:00-00-00-00-00-00 文本格式,永久。
我使用下面的代码来显示 PowerShell 作业的结果,超时时间为 120 秒。我想通过合并Write-Progress(基于完成的作业数量)来增强此代码。我尝试使用此示例作为参考,但是,当我尝试合并该代码时,进度条会在所有作业全部完成后短暂显示。
$Jobs = @()
$ForceStoppedIds = @{}
$Jobs += Get-Job
$Jobs | Wait-Job -Timeout 120 | Out-Null
$Jobs | ?{$_.State -eq 'Running'} | Stop-Job -PassThru | %{$ForceStoppedIds[$_.Id] = $true}
foreach ($Job in $Jobs) {
$Name = $Job.Name
$Output = (Get-Job -Name $Name | Receive-Job)
if ($ForceStoppedIds.Contains($Job.Id)) {
Write-Output "$($Name) - Device unable to process request within 2 minutes"
} else {
Write-Output $Output
}
}
Run Code Online (Sandbox Code Playgroud) powershell ×9
forms ×2
asp.net ×1
batch-file ×1
datatable ×1
mysql ×1
nginx ×1
nginx-config ×1
progress-bar ×1
python ×1
start-job ×1
webclient ×1
windows-10 ×1