执行powershell脚本的最佳方法" .ps1"

时间:2017-09-19 19:05:13

标签: powershell

执行.ps1脚本的最佳方法是什么? 如果我是一个不知道PowerShell的用户,但我想双击脚本并让它运行。
你能否就最佳实践提出建议?

谢谢

[CmdletBinding()]
Param(
    [Parameter(Mandatory = $False,        
        ValueFromPipeline = $True, 
        ValueFromPipelineByPropertyName = $True,         
        HelpMessage = "Provide Files Path.")]
    [string]$FilesPath = 'C:\Users\myusername\OneDrive - mycompany\mycompany\Sales & Marketing\Sales Reports', 
    [Parameter(Mandatory = $False,
        ValueFromPipeline = $True,
        ValueFromPipelineByPropertyName = $True,
        HelpMessage = "Provide Sheet Name.")]
    [string]$SheetName = 'Expenses'
)

Try
{
    $Files = Get-ChildItem -Path $FilesPath -Include *.xlsx, *.xls, *.xlsm -Recurse 
    $Counter = $Files.Count  
    $Array = @()
    $OutPutFilePath = (Join-Path $FilesPath -ChildPath "Exported-ExcelData.csv")
    Remove-Item -Path $OutPutFilePath -Force  -ErrorAction SilentlyContinue
    ForEach ($File In $Files)
    {                
        Write-Verbose -Message "Accessing File $($File.Name) and Exporting Data from Sheet $SheetName. Remaining $Counter Files." -Verbose 
        $Counter -= 1
        $AllData = Import-Excel -Path $File.FullName -WorksheetName $SheetName -NoHeader
        $i = 0 
        ForEach ($Data In $AllData)
        {
            $ArrayData = "" | Select-Object "P1", "P2", "P3", "P4", "P5", "P6"
            $ArrayData.P1 = $Data[0].P1
            $ArrayData.P2 = $Data[0].P2
            $ArrayData.P3 = $Data[0].P3
            $ArrayData.P4 = $File.Name
            $ArrayData.P5 = $File.FullName 
            $ArrayData.P6 = ($i += 1)
            $Array += $ArrayData
        }
    }
    $Array | Export-Csv -Path $OutPutFilePath -Append -NoTypeInformation 
}
Catch
{
    $ErrorLog = "Error On " + (Get-Date) + ";$($_.Exception.Message) - Line Number: $($_.InvocationInfo.ScriptLineNumber)"
    Write-Error "$($_.Exception.Message) - Line Number: $($_.InvocationInfo.ScriptLineNumber)"    
}
Finally
{
    Write-Host "Process has been completed!" -ForegroundColor Green
    Read-Host "Press any key to continue..."
}    

2 个答案:

答案 0 :(得分:4)

创建批处理文件。 由于Powershell策略,启动PS1文件可能会出现问题,并且默认情况下,Windows机器上的PS1脚本无法启动。

但是,如果您创建一个引用PS1脚本的批处理文件,那么您已经完成了设置。

-ExecutionPolicy Bypass将忽略当前的系统策略,因此您的脚本可以毫无问题地运行。

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SO\Desktop\YourScript.ps1'"

请参阅下面两个使用相对路径的批处理命令。

# Launch script
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%mypath:~0,-1%\data\install.ps1'"

# Same thing but force the script to run as admin
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -NoExit -File ""%mypath:~0,-1%\data\install.ps1""' -Verb RunAs}"

在这两个变体中,我正在推出的PS1位于一个名为data的子文件夹中,脚本称为install.ps1。 因此,我不必在批处理文件中对脚本路径进行硬编码(您可以将PS1放在与批处理文件相同的级别。在我的示例中,我实际上只希望第一个文件夹级别的批处理和其他所有内容“隐藏从视图“在子文件夹中,这样用户就不必考虑要执行的文件。

答案 1 :(得分:2)

我建议编译脚本,我相信这是可靠地双击脚本的唯一方法。还有其他方法,但它们需要削弱安全性,部分原因是难以在不同的系统上运行。

我发现编译powershell的最简单方法是使用PowerGUI。您可以粘贴脚本并编译可以双击的可移植.exe文件。它不需要提升权限。他们的网站不再托管它,因此您需要找到第三方下载。

您还可以找到Visual Studio扩展程序或Sapien的产品之一,但是这两种产品都需要花钱,而且只是创建一个基本的双击脚本并不是更好。

此外,您需要修改脚本以包含提示 - 假设您编写了代码,应该很容易完成。基本上,如果你在ISE中点击RUN,你需要得到它,这样你就不必输入任何你没有直接要求的东西。