【问题标题】:How to pass batch file variables to PowerShell script? [duplicate]如何将批处理文件变量传递给 PowerShell 脚本? [复制]
【发布时间】:2019-11-19 13:31:16
【问题描述】:

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

我尝试了以下链接,这些链接让我了解了现在的情况:

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

【问题讨论】:

  • 你有一个基本的批处理错误:你不应该在set命令中包含除等号之外的任何空格set oName=Name,因为等号之前的空格(以及等号之后)都包含在变量名(或值)中。 set 命令的建议形式是用引号将变量及其值括起来:set "oName=Name"
  • echo text >> file.ext 也会将>> 之前的空格 写入文件,所以要么删除它,要么更好地使用>> "file.ext" echo text。而cmd /S command 不能工作,它必须是cmd /S /C commandcmd /S /K command;虽然我相信你在这里根本不需要cmd,只需使用powershell ... -File ......

标签: powershell batch-file


【解决方案1】:

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

我必须跑去火车,所以现在这会有点麻烦,我会稍等一下,现在只是粘贴一些示例代码,这样我就可以把它变成你的代码了

p>

好的,什么,嗯,你打算对这个特殊代码 to.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"
)

【讨论】:

  • 集合是否应该包含在“”中?
  • 我的意思是变量。即设置“oStart=%YYYY%%MM%%DD% %TIME%”
  • 是的,您将 " 包裹在 Content 周围为 SET,以确保不包含错误空格,并将 = 直接放在变量名称旁边以确保变量名本身不包含空格,然后是 = 旁边的内容,以确保其左侧也不包含错误的空格。这是一种相当标准的方法,它使用了在 Windows NT 4.x 到 Windows 2019 中可用的未记录的 SET 功能,以促进更清晰的变量分配。
  • 好吧,这是有道理的。我运行了它,但在 PS 端尝试了这条线:“我在”| out-file -Encoding ascii -filepath $LOG_FILE -append 看看它是否有效。但什么都没有。我还删除了你在另一边所做的重置,这样我就可以保留每个变量的值。
  • 这里可能是一个愚蠢的问题,但是 PS 脚本在哪里执行。我看到它设置了,但它什么时候执行。
【解决方案2】:

注意空格。

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

【讨论】:

    猜你喜欢
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多