powershell - 对文件夹中的每个文件执行的 Powershell 脚本?
问题描述
我目前有一个 powershell 脚本,它打印出有关作为参数传入的文件的一些信息。
执行脚本的命令,它是这样完成的:
.\myscript.ps1 -accessitem C:\folder
我想将脚本应用于驱动器上的所有文件和文件夹C:
,我是否可以 for 循环列出所有文件,并将路径作为脚本的参数传递?
剧本:
[CmdletBinding()]
Param (
[Parameter(Mandatory=$True,Position=0)]
[String]$AccessItem
)
$ErrorActionPreference = "SilentlyContinue"
If ($Error) {
$Error.Clear()
}
$RepPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$RepPath = $RepPath.Trim()
$str = $AccessItem -replace ':',''
$str = $AccessItem -replace '/','.'
$FinalReport = "$RepPath\"+$str+".csv"
$ReportFile1 = "$RepPath\NTFSPermission_Report.txt"
If (!(Test-Path $AccessItem)) {
Write-Host
Write-Host "`t Item $AccessItem Not Found." -ForegroundColor "Yellow"
Write-Host
}
Else {
If (Test-Path $FinalReport) {
Remove-Item $FinalReport
}
If (Test-Path $ReportFile1) {
Remove-Item $ReportFile1
}
Write-Host
Write-Host "`t Working. Please wait ... " -ForegroundColor "Yellow"
Write-Host
## -- Create The Report File
$ObjFSO = New-Object -ComObject Scripting.FileSystemObject
$ObjFile = $ObjFSO.CreateTextFile($ReportFile1, $True)
$ObjFile.Write("NTFS Permission Set On -- $AccessItem `r`n")
$ObjFile.Close()
$ObjFile = $ObjFSO.CreateTextFile($FinalReport, $True)
$ObjFile.Close()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ObjFSO) | Out-Null
Remove-Variable ObjFile
Remove-Variable ObjFSO
If((Get-Item $AccessItem).PSIsContainer -EQ $True) {
$Result = "ItemType -- Folder"
}
Else {
$Result = "ItemType -- File"
}
$DT = Get-Date -Format F
Add-Content $ReportFile1 -Value ("Report Created As On $DT")
Add-Content $ReportFile1 "=================================================================="
$Owner = (Get-Item -LiteralPath $AccessItem).GetAccessControl() | Select Owner
$Owner = $($Owner.Owner)
$Result = "$Result `t Owner -- $Owner"
Add-Content $ReportFile1 "$Result `n"
(Get-Item -LiteralPath $AccessItem).GetAccessControl() | Select * -Expand Access | Select IdentityReference, FileSystemRights, AccessControlType, IsInherited, InheritanceFlags, PropagationFlags | Export-CSV -Path "$RepPath\NTFSPermission_Report2.csv" -NoTypeInformation
Add-Content $FinalReport -Value (Get-Content $ReportFile1)
Add-Content $FinalReport -Value (Get-Content "$RepPath\NTFSPermission_Report2.csv")
Remove-Item $ReportFile1
Remove-Item "$RepPath\NTFSPermission_Report2.csv"
Invoke-Item $FinalReport
}
If ($Error) {
$Error.Clear()
}
我希望使用外部命令来执行此操作,因为不应更改脚本的工作方式,它用于单文件测试..
解决方案
有两种方法可以做到这一点:
- 将
-Recurse
标志添加到脚本 - 在每个目录上运行脚本
我选择选项二,因为脚本看起来很复杂,我不想碰它。
$path_to_script = "C:\path\to\myscript.ps1"
$start_directory = "C:\folder"
# Call Script on Parent Directory
& "$path_to_script" -AccessItem "$start_directory"
# Call Script on any Child Directories within the "$start_directory"
foreach($child in (ls "$start_directory" -Recurse -Directory))
{
$path = $child.FullName
& "$path_to_script" -AccessItem "$path"
}
基本上,我在父目录和父目录中的任何子目录上调用脚本。
推荐阅读
- javascript - 材质界面 | 反应 | OnClick 事件总是发送最后一个索引
- java - 将数据从 java 内置类存储到自定义类
- java - 如果我的物体碰到了障碍,我如何在通过障碍并结束比赛时增加分数?
- html - 使用文章元素时 z-index 无法正常工作
- parse-platform - 客户数据库结构
- web3 - 如何将 RawTransaction 发送到 Quorum 区块链
- kibana - 自定义插件上的 Kibana 角色管理
- javascript - 仅使用 CSS 的字符串中的不同颜色
- testing - 即使某些属性不相同,测试 bloc 状态也会通过
- java - 得到错误 java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;