2016-11-17 92 views
0

,所以我想知道如何使PowerShell的腳本A可以創建的PowerShell 腳本B通過第一PowerShell腳本開創全省另一個獨立的PowerShell腳本

主要目標是有腳本B是獨立的腳本A(出於安全目的)。我有鑰匙,我得到腳本A並散列它們。

我也想有一個腳本創建腳本B,如腳本B會做一個動作,也將採取其他獨立的環境。

所以我怎能:

答:使通過第一新的腳本?

B:都有,$ HASH1(key1的哈希),傳遞給腳本B,這樣當在一個單獨的虛擬機或PC環境腳本B運行時,它不需要腳本A使用$ HASH1

感謝

+0

因此,從我能收集的目標是讓腳本A生成腳本B,它依賴於散列,但然後以某種方式讓腳本B工作而不存在散列?這是行不通的,要麼散列在那裏,並且可以被腳本用於授權(以及通過擴展讀取腳本的任何人)或散列不存在,腳本將無法授權。另一方面,如果你只是希望腳本A用一些獨特的散列產生腳本B,你可以用'Out-File'來完成,但任何有權訪問腳本B的人都可以訪問你的密鑰(即使散列)。 –

+2

可能很高興知道你爲什麼要這樣做,因爲你手上有XY問題。也許知道這個真正的動機會給你一個更好的答案。 – Matt

+0

@Matt 在所有的實際情況中,我的目標是最終制作一個腳本,通過對話框請求一個鍵,通過ps1腳本對它進行散列並創建一個可重用的exe文件,以激活窗口,軟件等....我已經創建了一個腳本手動完成後者...但沒辦法簡化這個過程到祖母級別只需雙擊一個文件,輸入新的密鑰並基於它生成一個新的exe。 – AdilZ

回答

1

答:PowerShell腳本保存爲文本。您(=腳本A)可以將文本打印到文件中(例如scriptB.ps),並且可以執行此文件。 B:您可以在腳本A中使用「return statement」。如果您不需要此散列,那麼即使沒有此輸入參數或使用默認參數,您也必須編寫代碼才能運行。如何?用if語句可能。

1

我創建了一個類似於你所描述的工具,只是它在範圍上更受限制,但也許更通用。我實際上創建它不生成PowerShell腳本,但生成SQL腳本。我可以用它來生成PS腳本,但非常有限的形式,它應該是這樣的:

& someFunctionorApp -arg11 -arg12 -arg13 ... 
& someFunctionorApp -arg21 -arg22 -arg23 ... 

也許重複一百遍。這些參數都來自某個數據源或其他數據源,爲了舉例,我只是插入了通用名稱。這個生成的腳本可能通過蠻力強制聰明的腳本編寫者在循環中完成,但這樣做也行。

對於我的工具,驅動程序是存儲在CSV文件中的數據。我可以從數據庫,電子表格和捕獲信息的簡單PS腳本獲取CSV文件。不同的CSV文件具有不同的標題,不同的字段名稱等等。該工具是通用的。我的工具的其他輸入是我稱之爲模板的內容。在這種情況下,模板只是一個帶有一些嵌入式PS變量的文本文件。該工具通過CSV文件運行,獲取實際值以存儲PS變量。

輸出在控制檯上出現,但很容易重定向到文件。

只是爲了咧嘴笑,我已經包含了該工具。如果該工具不符合你的喜好,也許你可以採用一兩種技術來適應它們。

<# This function is a table driven template tool. 
    It's a refinement of an earlier attempt. 

    It generates output from a template and 
    a driver table. The template file contains plain 
    text and embedded variables. The driver table 
    (in a csv file) has one column for each variable, 
    and one row for each expansion to be generated. 

    5/13/2015 

#> 

function Expand-csv { 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$true)] 
     [string] $driver, 
     [Parameter(Mandatory=$true)] 
     [string] $template 
    ) 
    Process 
    { 
     $OFS = "`r`n" 
     $list = Import-Csv $driver 
     [string]$pattern = Get-Content $template 

     foreach ($item in $list) { 
     foreach ($key in $item.psobject.properties) { 
      Set-variable -name $key.name -value $key.value 
      } 
     $ExecutionContext.InvokeCommand.ExpandString($pattern) 
     } 
    } 
}