0

我正在尝试将我的批处理文件处理的一些变量传递给 Powershell 脚本。我面临的问题是,首先批处理文件的整个结果出现在命令提示符下,并且我打算传递的变量旁边没有传递给 Powershell 脚本。此外,我必须输出日志文件内容的变量只需将命令发送回屏幕。

我已经尝试了以下链接,这些链接让我到了现在:

  1. 执行 Powershell 脚本的批处理文件

  2. 将变量从批处理传递到powershell

  3. 将参数从批处理文件传递到 PowerShell 脚本

  4. 将带有空格的批处理变量传递给powershell脚本?

批处理文件端

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 进行处理。

4

2 回答 2

1

哦,Easy-Peasy,我为我的 Power shell 执行此操作,我们需要 CMD 包装器。

我必须跑去火车,所以现在这会有点麻烦

好的,什么,嗯,你打算为这个特定代码做什么? l 做什么?我似乎无法弄清楚你的意图是什么,它只是一些虚拟代码吗?

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

好的,进一步审查我认为你想将日志读入 CMD 中的几个字符串变量,然后在你的脚本调用中使用其中一个......但是,为什么?

字符串将相互附加,并且您将被限制为最多 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"
)
于 2019-07-10T00:37:02.520 回答
1

非常小心空间。

set oName=taco
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '.\ScriptName.ps1' -oName '%oName%' "
于 2019-07-10T02:14:02.487 回答