簡體   English   中英

從bat文件將參數傳遞給PowerShell

[英]Passing parameters to PowerShell from bat file

我拼命地嘗試將參數從批處理文件傳遞到PowerShell腳本,該腳本檢查Windows服務是否正在運行。

這是我完全可操作的命令:

.\nsrservices.ps1 -cmd running nsrexecd,stisvc

但問題是命令的行為:

  • 在PowerShell窗口中,服務名稱被視為兩個(或更多),因此檢查'nsrexecd'然后檢查'stisvc'
  • 在批處理文件中,服務名稱作為唯一值傳遞給PowerShell,因此檢查'nsrexecd,stisvc'

這是我的bat文件:

powershell.exe -File .\nsrservices.ps1 -cmd running nsrexecd,stisvc
ECHO.%ERRORLEVEL%
exit /B %ERRORLEVEL%

在我的PS文件中,參數定義如下:

param([string]$cmd=$(throw "Type d'action manquante !"),[string[]]$srv)

在日志文件中,我得到了這兩個結果(抱歉法國輸出)。

在PowerShell窗口中:

24/12/2015 09:02:50-Paramètres appelés : cmd=running srv=stisvc nsrexecd
24/12/2015 09:02:50-Début test de l'état running du service : stisvc
24/12/2015 09:02:50-    Début évaluation de l'état du service : stisvc
24/12/2015 09:02:50-    Fin évaluation de l'état du service : stisvc
24/12/2015 09:02:50-Le service tourne
24/12/2015 09:02:50-Fin test de l'état running du service : stisvc
24/12/2015 09:02:50-Début test de l'état running du service : nsrexecd
24/12/2015 09:02:50-    Début évaluation de l'état du service : nsrexecd
24/12/2015 09:02:50-    Fin évaluation de l'état du service : nsrexecd
24/12/2015 09:02:50-Le service tourne
24/12/2015 09:02:50-Fin test de l'état running du service : nsrexecd

這意味着服務按順序進行測試

從.bat文件:

24/12/2015 09:04:24-Paramètres appelés : cmd=running srv=nsrexecd,stisvc
24/12/2015 09:04:24-Début test de l'état running du service : nsrexecd,stisvc
24/12/2015 09:04:24-    Début évaluation de l'état du service : nsrexecd,stisvc
24/12/2015 09:04:24-        Le service nsrexecd,stisvc n'existe pas !
24/12/2015 09:04:24-    Fin évaluation de l'état du service : nsrexecd,stisvc
24/12/2015 09:04:24-Fin test de l'état running du service : nsrexecd,stisvc

這意味着名為“nsrexecd,stisvc”的服務不存在。

使用.bat文件時,我的兩個名字之間的逗號似乎會引起混淆

所以我正在努力找到一個解決方法來贏得這個血腥的.bat文件。

我試過報價,單引號,-File,-Command,但沒有成功。

任何線索或解決方案都會非常受歡迎,因為我在這個論壇上的研究沒有給我一些可用的東西。

當然,之后我想用參數調用.bat文件。

在你的情況下,我將使用:

[parameter(Mandatory=$true,
           ValueFromRemainingArguments=$true)]
[String[]]
$services

您的批量調用將如下所示

powershell.exe -File .\nsrservices.ps1 -cmd running nsrexecd stisvc

有關更多詳細信息,請查看about_Functions_Advanced_Parameters

最后,我改變了方向。 因為我有空格的服務名稱(我必須在.bat文件中包含我的.ps1),所以我決定將參數控制放在main中,然后離開

param([string]$cmd,[string[]]$srv)

沒有控件的行。

謝謝大家。

從我通常做的BAT文件中調用PowerShell腳本

PowerShell .\script.ps1 -arg 1234 -arg2 5678

要么

PowerShell C:\path\to\script.ps1 -arg 1234 -arg2 5678

您的PowerShell腳本文件應具有類似的功能

param([string]$arg, [string]$arg2)

在腳本的頂部和開頭。

在我的param([string] $ arg,[string] $ arg2)中,我將開關名稱分別定義為arg和arg2。 因此,BAT文件將在-arg之后將任何內容分配給$ arg,並將-arg2之后的任何內容分配給$ arg2。

我們可以根據您的腳本將其更改為更方便的內容,例如在PowerShell腳本中我們可以將其更改為

param([string]$computer, [string]$filename)

在我們的BAT文件中,我們可以像上面一樣調用PowerShell,而不是-arg和-arg2,我們將使用-computer和-filename。

請記住它是特定於訂單的,因此您可以使用類似的參數調用腳本

PowerShell .\script.ps1 -computer MyComputer -filename MyFileName

要么

PowerShell .\script.ps1 -filename MyFileName -computer MyComputer

-filename將始終轉到$ filename

- 計算機將永遠到$計算機。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM