什么是最佳实践,我有点黑暗.我正在创建一个删除早于文件的函数,但是我想添加一个名为-Remote
可选的开关,但是当你选择使用它时,交换机需要强制信息,比如$Server
在远程服务器上执行以下整个功能通过使用Invoke-Command
.
像这样的东西:
Delete-OldFiles -Target "\\Share\Dir1" -OlderThanDays "10" -LogName "Auto_Clean.log" -Remote "SERVER1"
脚本/功能
Function Delete-OldFiles
{
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,Position=1)]
[ValidateScript({Test-Path $_})]
[String]$Target,
[Parameter(Mandatory=$True,Position=2)]
[Int]$OlderThanDays,
[Parameter(Mandatory=$True,Position=3)]
[String]$LogName
)
if ($PSVersionTable.PSVersion.Major -ge "3") {
# PowerShell 3+ Remove files older than (FASTER)
Get-ChildItem -Path $Target -Exclude $LogName -Recurse -File |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$OlderThanDays) } | ForEach {
$Item = $_.FullName
Remove-Item $Item -Recurse -Force -ErrorAction SilentlyContinue
$Timestamp = (Get-Date).ToShortDateString()+" | "+(Get-Date).ToLongTimeString()
# If files can't …
Run Code Online (Sandbox Code Playgroud) 在我的 PowerShell 脚本中,我尝试进行一些错误处理。但是,我依赖于使用Try/Catch
子句的高级函数。因此,函数中的代码块偶尔会失败并Catch
在生成错误后转到子句。此时变量$Error
被填充了一个错误。
如果我然后在我的脚本中查阅该变量,$Error
它会告诉我有一个记录,这是正确的。但是我想知道是否可以只删除Catch
子句中函数中的最后一个错误?所以我可以保持我的$Error
变量清除脚本错误。
问题出在Get-ADTSProfileHC
. 我试图删除最后一个错误,$Error[0] | Remove-Item
但失败了。
功能:
Function Get-ADusersHC {
[CmdletBinding(SupportsShouldProcess=$True)]
Param(
[Parameter(ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true,Position=0)]
[String[]] $OU
)
Begin {
Function Get-ADOUNameHC {
$CanonicalName = $_.CanonicalName
[System.Collections.ArrayList]$Pieces = $CanonicalName.split(“/”)
$Pieces.Remove($Pieces[-1])
$OU = $Pieces -join '\'
$OU -replace ($Pieces[0],$Pieces[0].ToUpper())
}
Function Get-ADManagerDisplayNameHC {
$m = Get-ADObject -Identity $_.manager -Properties displayName,cn
if($m.ObjectClass -eq "user") { $m.displayName } Else{ $m.cn }
}
Function Get-ADTSProfileHC {
[CmdletBinding()]
Param( …
Run Code Online (Sandbox Code Playgroud) 我正在试图找出如何组合2个阵列,如微软此处所述.
$Source = 'S:\Test\Out_Test\Departments'
$Array = Get-ChildItem $Source -Recurse
$Array.FullName | Measure-Object # 85
$Array.FullName + $Source | Measure-Object # 86
$Source + $Array.FullName | Measure-Object # 1
Run Code Online (Sandbox Code Playgroud)
以下只有1项要迭代:
$i = 0
foreach ($t in ($Source + $Array.FullName)) {
$i++
"Count is $i"
$t
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果$Source
或$Array
为空,它不再生成单独的对象并将它们全部粘在一起,如上例所示.有没有办法强制它成为单独的对象而不是一个连接的对象?
我们在 vbs 的帮助下启动 PowerShell 脚本以避免它生成的弹出窗口。这可以完美地工作,如下所示:
PS_Launcher.vbs
:
'run window totally hidden
Dim oSHELL
Set oSHELL = CreateObject("WScript.Shell")
oSHELL.CurrentDirectory = "C:\users\bob\AppData\Local\Temp"
oSHELL.Run "powershell.exe -ExecutionPolicy Bypass -NoLogo -File .\PS_Script.ps1", 0
Set oSHELL = Nothing
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,当我们从计划任务中或从命令提示符 (CMD) 运行此命令时,它不会等待 PowerShell 脚本完成并立即返回提示符。
有没有办法让它等待 PowerShell 脚本完成后再继续?
我们已按照 中所述尝试了以下操作bWaitForReturn
,但没有成功:
oSHELL.Run "powershell.exe -ExecutionPolicy Bypass -NoLogo -File .\PS_Script.ps1", 0, True
Run Code Online (Sandbox Code Playgroud)
PS_Script.ps1
:
Start-Sleep -Seconds 15
Get-WmiObject -Class Win32_MappedLogicalDisk |
Select-Object Name, ProviderName |
Export-Csv .\PS_Data.txt -NoTypeInformation
Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
$Obj = @(
[PSCustomObject]@{
LimitNew = 5368709120
Usage = 6166915072
}
[PSCustomObject]@{
LimitNew = 10737418240
Usage = 5368709120
}
[PSCustomObject]@{
LimitNew = 107374182400
Usage = 86973087744
}
[PSCustomObject]@{
LimitNew = 107374182400
Usage = 97710505984
}
)
$CultInfo = New-Object System.Globalization.CultureInfo -ArgumentList 'en-us',$false
$CultInfo.NumberFormat.PercentDecimalDigits = 2
$Obj |select @{L='pct used';E={($_.Usage/$_.LimitNew).ToString('P', $CultInfo)}}
Run Code Online (Sandbox Code Playgroud)
它返回以下输出:
pct used
--------
114.87 %
50.00 %
81.00 %
91.00 %
Run Code Online (Sandbox Code Playgroud)
我真正想要的是以下输出:
pct used
--------
114.87 %
50 %
81 %
91 %
Run Code Online (Sandbox Code Playgroud)
在阅读文档时,我似乎找不到在其末尾省略尾随零的选项。该方法$CultInfo.NumberFormat.PercentDecimalDigits
指定要查看小数点分隔符后的位数,而不是忽略零的位数。
如何拆分此字符串:
$Arguments = '/NOGUI /DATE /EXPAND 4 /SIZEUNIT 3 /SORTTYPE 0 /EXCEL "S:\Test\Brecht\Log Test\Report 13.xlsx" /SHEETNAME "Data set" /SCANPATH "S:\My Folder"'
Run Code Online (Sandbox Code Playgroud)
进入以下数组:
/NOGUI
/DATE
/EXPAND
4
/SIZEUNIT
3
/SORTTYPE
0
/EXCEL
"S:\Test\Brecht\Log Test\Report 13.xlsx"
/SHEETNAME
"Data set"
/SCANPATH
"S:\My Folder"
Run Code Online (Sandbox Code Playgroud)
使用时,$Argument.split(' ')
它还会拆分双引号字符串,这是不希望的。在ScriptingGuy 的博客上,他们解释了可能的情况。但我似乎找不到一种方法来忽略双引号之间的字符串。
将身份验证添加到后端 Graphql 服务器后,“Schema”和“Docs”在 Graphql Playground 中不再可见。在 Playground 中向“HTTP HEADERS”添加令牌时执行查询在经过身份验证时可以正常工作,而在用户未经身份验证时则不能正常工作,所以没关系。
我们禁用了 Apollo 服务器的内置 Playground,并使用中间件graphql-playground-middleware-express
来使用不同的 URL 并绕过身份验证。我们现在可以浏览到 Playground 并使用它,但我们无法读取那里的“架构”或“文档”。
尝试启用introspection
并没有解决此问题。passport.authenticate()
打电话过来会更好Context
吗apollo-server
?还有一个名为Passport-graphql 的工具,但它适用于本地策略,可能无法解决问题。我还尝试在调用 Playground 路由之前在标头中设置令牌,但这不起作用。
我们对此有点迷失。感谢您为我们提供的任何见解。
相关代码:
// index/ts
import passport from 'passport'
import expressPlayground from 'graphql-playground-middleware-express'
const app = express()
app.use(cors({ origin: true }))
app.get('/playground', expressPlayground({ endpoint: '/graphql' }))
app.use(passport.initialize())
passport.use(bearerStrategy)
app.use(
passport.authenticate('oauth-bearer', { session: false }),
(req, _res, next) => { next() }
)
;(async () => { …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个函数来创建一个变量$Credentials
,我在另一个函数中使用它来验证它是否有效.通过return $Credentials
在函数中使用我希望变量在Function Import-Password
运行后可用,但事实并非如此.
我认为这可以通过使用来解决$script:Credentials
,但我不认为如果函数可以输出这个变量就需要它.
谢谢您的帮助.
功能导入密码
# Check the password file
Function Import-Password ($UserName,$PasswordFile,[switch]$SendMail) {
try {
if (!(Test-Path $PasswordFile)) {
Write-Host "$env:COMPUTERNAME > Check password file: $PasswordFile > The password file can not be found`n
- Password file :`t $PasswordFile
- Server name :`t $env:COMPUTERNAME" -ForegroundColor Yellow
if ($SendMail) {
Send-Mail "FAILED AD Authentication" "The password file can not be found" "- Password file : $PasswordFile<br>- Server name : $env:COMPUTERNAME"
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个包含该目录(文件和文件夹)中的所有内容并保留目录结构的 Zip 文件。
通过在网上环顾四周,我发现很多人都有这个问题。因此,为了方便自己,我安装了pscx
包含 CmdLet的模块Write-Zip
。
文件夹结构
- S:\TopFolder
- S:\TopFolder\Folder1
- S:\TopFolder\Folder1\SubFolder1
- S:\TopFolder\Folder1\SubFolder1\Stuff1.txt
- S:\TopFolder\Folder2
- S:\TopFolder\Folder2\SubFolder2
- S:\TopFolder\Folder2\SubFolder2\Stuff2.txt
Run Code Online (Sandbox Code Playgroud)
测试代码
$Test = Get-ChildItem -Recurse 'S:\TopFolder\*'
Write-Zip -Path $Test -OutputPath 'S:\Zippie.zip' -IncludeEmptyDirectories
$Test = Get-ChildItem -Recurse 'S:\TopFolder'
Write-Zip -Path $Test -OutputPath 'S:\Zippie.zip' -IncludeEmptyDirectories
Run Code Online (Sandbox Code Playgroud)
结果是“Zippie.zip”
SubFolder1
SubFolder1\Stuff1.txt
SubFolder2
SubFolder2\Stuff2.txt
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它没有坚持正确的文件夹结构,Folder1
并且Folder2
丢失了。有什么明显的我在这里失踪了吗?因为此问题已报告为已修复并已验证。
感谢您的帮助。
我正在尝试生成类似的输出字符串Item1, Item2
,并用逗号分隔符将其连接起来。我们通过在中初始化一个空数组来实现此目的Select-Object -Property
。
检查此代码:
$Test = @(
[PSCustomObject]@{
Name = 'Test'
}
[PSCustomObject]@{
Name = 'Test2'
}
) | Select-Object -Property @{N = 'Problem'; E = { @() } },
@{N = 'EmployeeType'; E = { $null } }, *
foreach ($R in $Test) {
$R.Problem += 'Item1'
$R.Problem += 'Item2'
}
$Test | Select-Object -Property @{Name = 'Problem'; Expression = { $_.Problem -join "; " } }, * -ExcludeProperty Problem | fl
Run Code Online (Sandbox Code Playgroud)
结果:
Problem : …
Run Code Online (Sandbox Code Playgroud) powershell ×9
arrays ×2
7zip ×1
express ×1
function ×1
graphql ×1
passport.js ×1
percentage ×1
pscx ×1
split ×1
string ×1
variables ×1
vbscript ×1
zip ×1