Сценарий Powershell выполняется для каждого файла в папке? - PullRequest
0 голосов
/ 15 мая 2018

В настоящее время у меня есть сценарий powershell, который выводит некоторую информацию о файлах, переданных в качестве аргумента.

Команда для выполнения скрипта, она сделана так:

.\myscript.ps1 -accessitem C:\folder

Я хочу применить скрипт ко всем файлам и папкам на диске C:, возможно ли в цикле перечислить все файлы и передать путь в качестве аргумента для скрипта?

Сценарий:

[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()
}

Я бы предпочел, чтобы внешняя команда делала это, поскольку работа скрипта не должна изменяться, она используется для тестирования одного файла.

1 Ответ

0 голосов
/ 15 мая 2018

Есть два способа сделать это:

  1. Добавить -Recurse Отметить скрипт
  2. Запустить скрипт в каждом каталоге

Я выбрал второй вариант, поскольку сценарий выглядит достаточно сложным, и я не хочу его трогать.

$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"
}

Обычно я вызываю скрипт в родительском каталоге и во всех подкаталогах в родительском каталоге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...