执行.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..."
}
答案 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,你需要得到它,这样你就不必输入任何你没有直接要求的东西。