如何将批处理文件变量传递到PowerShell脚本?

时间:2019-07-10 00:19:59

标签: powershell batch-file

我试图将批处理文件处理的多个变量传递给Powershell脚本。我面临的问题是,首先批处理文件中的全部结果都出现在命令提示符下,而我打算传递的变量旁边没有传递给Powershell脚本。另外,只需将命令发送回屏幕,变量I就必须输出日志文件的内容。

我尝试了以下链接,这些链接使我了解到了现在为止:

  1. Batch file to execute a Powershell script

  2. Pass variable from batch to powershell

  3. Pass parameter from a batch file to a PowerShell script

  4. Pass batch variables with spaces in them to powershell script?

批处理文件端

set LOG_FILE = "GDGAGnklasj;oks;fk;dkf lkl;"
set oName = Name
set oStart = "%YYYY%%MM%%DD% %TIME%" 
set oStatus = 0
set oEnd = "%YYYY%%MM%%DD% %TIME%" 
set oDateRan = %YYYY%%MM%%DD%
set oLog =for /f "delims=" %%i in (%LOG_FILE%) do set content=%content% %%i
echo Updating Database >> %LOG_FILE% 2>&1
cmd /S powershell.exe -ExecutionPolicy Bypass -File "C:\Reporting\updateTool.ps1" "%oName%" "%DateRan%" "%oStart%" "%oEnd%" "%oStatus "%oLog%

PowerShell脚本

param (
[string]$oName
)
"This is $oName"

我的目的是在批处理文件中设置变量,然后将它们发送到Powershell进行处理。

2 个答案:

答案 0 :(得分:1)

哦,Easy-Peasy,我是为我的Power外壳这样做的,我们需要相当多的CMD包装器。

我必须跑到火车上,这会有点麻烦,现在我要固定一点,现在只是粘贴一些示例代码,以便我可以将其作为您的代码

好吧,嗯,您打算将此特殊代码做什么?我似乎无法弄清楚您打算做什么,这只是一些伪代码吗?

  set oLog =for /f "delims=" %%i in (%LOG_FILE%) do set content=%content% %%i
  echo Updating Database >> %LOG_FILE% 2>&1

好的,进一步检查,我想您想将日志读入CMD中的几个sttring变量,然后在调用脚本时使用其中一个。....但是,为什么?

这两个字符串将相互追加,并且最多只能有8191个字符,而且由于将名称传递给Powershell,因此PowerShell可以轻松读取日志文件的内容。

这似乎是一个更好的计划,不是吗?

在所有具有YYYY MM DD的代码中,这些都是在使用前需要定义的变量,不确定是否可以理解。

.CMD脚本:

@(
   SETLOCAL ENABLEDELAYEDEXPANSION
   ECHO OFF

   SET "_PSScript=C:\Reporting\UpdateTool.ps1"
   REM SET "_DebugPreference=Continue"
   SET "_DebugPreference="SilentlyContinue"

   SET "_LOG_FILE=GDGAGnklasj;oks;fk;dkf lkl;"
   SET "_oName=Name."
   SET "_oStart=%YYYY%%MM%%DD% %TIME: =0%"
   SET /a "_Status=0"
   SET "_oEnd=%YYYY%%MM%%DD% %TIME: =0%" 
   SET "_oDateRan=%YYYY%%MM%%DD%"
)

SET "_PSCMD=Powershell "%_PSScript%" -DebugPreference "%_DebugPreference%" -LOG_FILE "%_LOG_FILE%" -oName "%_oName%" -oStart "%_oStart%" -Status %_Status% -oEnd "%_oEnd%" -oDateRan "%_oDateRan%" "


%_PSCMD% 2>&1 >> "_LOG_FILE"

PS1:

## Script: UpdateTool.ps1
# 

param(
    [String]$LOG_FILE = 'c:\admin\default.log',
    [String]$oName = 'default name'
    [String]$oStart = $(Get-date -F "yyyyMMdd HH:mm:ss.ms"),
    [Int]$oStatus = 0,
    [String]$oEnd = $(Get-date -F "yyyyMMdd HH:mm:ss.ms"),
    [String]$oDateRan = $(Get-date -F "yyyyMMdd"),
    $DebugPreference = "SilentlyContinue"
)

答案 1 :(得分:1)

请注意空格。

set oName=taco
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '.\ScriptName.ps1' -oName '%oName%' "