AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 564803
Accepted
Geekman
Geekman
Asked: 2014-01-04 02:07:48 +0800 CST2014-01-04 02:07:48 +0800 CST 2014-01-04 02:07:48 +0800 CST

Powershell脚本以某种方式执行时会无限循环运行

  • 772

我正在使用 Puppet 的 Exec Powershell 提供程序来运行一些 powershell 脚本。我对它执行我的脚本的方式有疑问。执行方法导致脚本反复运行。我被迫自己杀死进程,但脚本本身似乎运行正常。

我已经能够整理一个简单的例子,并缩小原因。

重现步骤

  1. 使用以下内容创建C:\backups\scripts\test.ps1:

我很确定这个问题与我执行 SQLCMD.exe 的方式有关,或者与执行所需的时间有关(大约一秒钟)

    $instance = '';
    $latest_output = "Hi";

    $cmd = "sqlcmd.exe -E -S .$instance -h -1 -m 1 -Q `"SET NOCOUNT ON; USE [master]; SELECT @@VERSION;`"";

    $output = [string](cmd.exe /C "$cmd");
    $output = $output.Trim(' ');

    if ($output -eq $latest_output)
    {
        Write-Host "Up to date.";
    }
    else
    {
        Write-Host "Updating...";
    }
  1. 打开 CMD.exe,运行以下命令,按预期工作:

    C:\Users\Administrator>powershell.exe -Command C:\backups\scripts\test.ps1
    Updating...
    
    C:\Users\Administrator>
    
  2. 现在改为像这样执行脚本,它会无限执行。这是 Puppet 中的 Exec 提供程序使用的有问题的语法:

    C:\Users\Administrator>powershell.exe -Command - < C:\backups\scripts\test.ps1
    Updating...
    Updating...
    Updating...
    Updating...
    
  3. 如果我添加exit;到 test.ps1 的末尾,它只会执行一次。

我最初的问题是,我怎样才能避免这种情况?但是添加exit对我来说是这样的。剩下的唯一问题是:为什么会发生这种情况?

编辑:一旦您将语法错误/异常带入脚本(例如缺少逗号),脚本将无限执行,每次都抛出异常。因此,虽然exit是一种解决方法,但它仍然很危险,因为它不适用于异常。

环境

  • Windows 2008 R2 服务器标准版
  • 具有高级服务的 Microsoft SQL Server Express 10.50.2500
  • 电源外壳 2.0
windows-server-2008
  • 1 1 个回答
  • 2688 Views

1 个回答

  • Voted
  1. Best Answer
    James Santiago
    2014-01-04T05:00:48+08:002014-01-04T05:00:48+08:00

    Powershell 似乎对它作为标准输入接收的内容很敏感(使用 < 来重定向标准输入)。它可能正在接收它不期望的字符。我建议删除所有换行符并将脚本保存在记事本中。所以你的脚本看起来像这样:

    $instance = ''; $latest_output = "Hi"; $cmd = "etc...
    

    通过我所做的少数测试,我收到了根据所使用的编码、空格和字符不同的行为。可能只是cmd 重定向输入的方式。

    您可能还希望将您的问题发布到 github 中的powershell puppet 项目。

    此外,您可能不想使用 write-host,因为它是控制台的标准输出,也可能是问题。

    在稍微不相关的注释上试试这个:

    $psi = New-Object System.Diagnostics.ProcessStartInfo;
    $psi.FileName = "powershell.exe"
    $psi.UseShellExecute = $false
    $psi.RedirectStandardInput = $true
    $p = [System.Diagnostics.Process]::Start($psi)
    

    点击 ctrl-c 然后你应该看到如下内容:

    PS C:\> PS C:\>
    

    当涉及到输入重定向时,Powershell 肯定会表现出奇怪的行为。

    • 2

相关问题

  • 文件复制到分支机构

  • 对于 ASP.Net 应用程序,Windows 64 位相对于 32 位的主要优势是什么?

  • Windows Server 2008 Hyper-V 虚拟化服务器的最佳 RAID 配置?

  • 远程连接 sql server 不工作,但如果防火墙禁用它呢?

  • 无法从 SQL Server 2008 备份数据库

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve