首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从CMD运行PowerShell脚本(棘手的)

从CMD运行PowerShell脚本(棘手的)
EN

Stack Overflow用户
提问于 2019-12-19 09:34:03
回答 3查看 622关注 0票数 0

我知道这听起来可能像以前在这里提出的一个问题(部分是正确的)。但我在这里有一个有趣的转折。

所需的流程:

从CMD运行Powershell脚本。似乎很琐碎,而且实际上正在工作,传递参数等等.

但是..。

我的powershell脚本有一个Start-作业,因为我希望它能运行异步。

代码语言:javascript
复制
#######################################################################

   #$DropLocation = "SOME UNC PATH"
   #$buildid = "SOME VERSION"
param (
        [parameter(Mandatory = $true)][string]$DropLocation,
        [parameter(Mandatory = $true)][string]$buildid
       ) 


Start-Job -Name Upload `
-ScriptBlock {

param (
        [parameter(Mandatory = $true)][string]$DropLocation,
        [parameter(Mandatory = $true)][string]$buildid
       ) 
Write-Output "asd"
$buildpath = $DropLocation+"\"+$buildid
$logs = gci $buildpath"\logs" -Name "ActivityLog.AgentScope*.xml"

#Start-Sleep -Seconds 300

if ($logs.PSPath -gt 0)
    { 
        $destination = $env:TEMP+"\Config\"
        Copy-Item $logs.PSPath "$destination $buildid.xml"
    }
} `
-ArgumentList $DropLocation,$buildid

#######################################################################

我使用Param从外部摄取,然后再一次在开始-作业中,以便异步作业得到它的params。

这个脚本被保存为SCRIPTNAME.ps1,我正在尝试从CMD运行它。

来自cmd的(以管理方式运行)

代码语言:javascript
复制
powershell "& "C:\temp\SCRIPTNAME.ps1" "SOME UNC PATH" "SOME VERSION""

代码语言:javascript
复制
powershell -file "C:\temp\SCRIPTNAME.ps1" "SOME UNC PATH" "SOME VERSION"

什么都没发生。

然而,从PowerShell ISE看,一切都运行良好。

我们非常感谢你们的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-23 22:10:45

powershell -noexit ". C:\temp\SCRIPTNAME.ps1"

这将改变作业的源函数的作用域,使其在当前运行的脚本范围内工作,同时允许您运行多个线程。

票数 2
EN

Stack Overflow用户

发布于 2019-12-23 01:00:52

根据所提供的脚本,我对您的问题的看法是,您的脚本在完成作业之前退出。

--

这两种行为都是并排的

ISE / VSCode

launched

  • Start-Job是
  • 脚本,称为
  • 脚本完成
  • 作业完成

CMD

通过cmd

  • Start-Job启动
  • 脚本是called
  • Script complete
  • Powershell会话终止(作业执行终止)
  • 作业永不完成

若要防止会话在作业完成之前被终止,请在脚本Receive-Job -Name 'upload' -Wait的末尾添加以下行

下面是修改后的新脚本。

代码语言:javascript
复制
#######################################################################

   #$DropLocation = "SOME UNC PATH"
   #$buildid = "SOME VERSION"
param (
        [parameter(Mandatory = $true)][string]$DropLocation,
        [parameter(Mandatory = $true)][string]$buildid
       ) 


Start-Job -Name Upload `
-ScriptBlock {

param (
        [parameter(Mandatory = $true)][string]$DropLocation,
        [parameter(Mandatory = $true)][string]$buildid
       ) 
Write-Output "asd"
$buildpath = $DropLocation+"\"+$buildid
$logs = gci $buildpath"\logs" -Name "ActivityLog.AgentScope*.xml"

#Start-Sleep -Seconds 300

if ($logs.PSPath -gt 0)
    { 
        $destination = $env:TEMP+"\Config\"
        Copy-Item $logs.PSPath "$destination $buildid.xml"
    }
} `
-ArgumentList $DropLocation,$buildid

# Prevent the session to be killed before the job return.
Receive-Job -Name 'upload' -Wait 
#######################################################################
票数 0
EN

Stack Overflow用户

发布于 2019-12-23 08:54:52

在不了解环境的配置文件/策略配置的情况下,我是否可以建议在下面的示例中使用配置文件/策略修饰符调用?有时,它们可以通过批处理执行powershell,从而实现所有的不同。

您是否尝试过在批处理中编写、生成和执行powershell脚本?

每当我需要powershell做cmd不能做的事情时,我就会将脚本编写为可以从批处理文件中调用的函数。

下面是我的方法的一个例子:

代码语言:javascript
复制
:createshortcut
(
ECHO # Create a Shortcut with Windows PowerShell
ECHO $SourceFileLocation = "%ShortcutTargetPATH%"
ECHO $ShortcutLocation = "%userprofile%\Desktop\%shortcutname%.Ink"
ECHO #New-Object : Creates an instance of a Microsoft .NET Framework or COM object.
ECHO #-ComObject WScript.Shell: This creates an instance of the COM object that             
represents the WScript.Shell for invoke CreateShortCut
ECHO $WScriptShell = New-Object -ComObject WScript.Shell
ECHO $Shortcut = $WScriptShell.CreateShortcut($ShortcutLocation^)
ECHO $Shortcut.TargetPath = $SourceFileLocation
ECHO $Shortcut.IconLocation = "%IconPATH%\%IconNameEXT%"
ECHO #Save the Shortcut to the TargetPath
ECHO $Shortcut.Save(^)
) >%AppDataPATH%\%PowerShellnameEXT%

TIMEOUT 1 >nul

Powershell.exe -NoProfile -ExecutionPolicy Bypass -File %AppDataPATH%\%PowerShellnameEXT%

TIMEOUT 1 >nul

DEL /Q "%AppDataPATH%\%PowerShellnameEXT%"

GOTO :EOF

设置脚本执行所需的值&然后调用函数即可。在使用这种方法时,要记住的关键是在编写.ps1文件时逃离适当的字符

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59406810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档