【问题标题】:Dynamically generating the filename for svn status output动态生成 svn status 输出的文件名
【发布时间】:2021-08-30 18:07:07
【问题描述】:

我有一个 chef-infra 设置,将 chef-node 作为 Windows 服务器。食谱(食谱)正在尝试获取 svn 工作副本文件夹的状态并将其写入文件中。输出文件的命名为CHEFRPT_TESTREPO_ddmmyyyy hh:mm:ss.txt。但是,以下代码无法生成所需的 带有日期和时间的动态文件名。

以下是配方的红宝石代码:

time = Time.now

execute 'stat' do
  cwd 'D:\inetpub\TEST_APP'
  command 'svn status > D:\SVN_CHECKOUT\REPORTS\CHEFRPT_TESTREPO_#{time.strftime("%Y-%m-%d%H:%M:%S")}.txt'
end

需要一些关于要在文件末尾附加的变量的帮助,以生成具有当前日期和时间的文件名。

谢谢!

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    如果您想在带有#{...} 的字符串中插入代码,则必须使用双引号" 而不是单引号'

    当您在command 参数中使用单引号时,将不会执行此插值,字符串将按原样使用(即包括字符串中的#{time.stftime...} 代码。

    因此,您的最终资源应如下所示:

    time = Time.now
    
    execute 'stat' do
      cwd 'D:\inetpub\TEST_APP'
      command "svn status > D:\\SVN_CHECKOUT\\REPORTS\\CHEFRPT_TESTREPO_#{time.strftime("%Y-%m-%d%H:%M:%S")}.txt"
    end
    

    有关 Ruby 中字符串文字语法的详细信息,请参阅 https://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Strings

    【讨论】:

    • 感谢您的建议,但仍然无法正常工作。试过这个命令 'svn status > D:\SVN_CHECKOUT\REPORTS\CHEFRPT_TESTREPO_"#{time.strftime("%Y-%m-%d%H:%M:%S")}".txt' 这也是命令 "svn status > D:\SVN_CHECKOUT\REPORTS\CHEFRPT_TESTREPO_#{time.strftime("%Y-%m-%d%H:%M:%S")}.txt" 但没有运气。
    • 我已将最终资源添加为编辑。请注意传递给 command 的插值字符串周围的双引号。
    • 应用您提到的更改后,在上传食谱时出现以下错误:致命:食谱文件 recipes/default.rb 有 ruby​​ 语法错误
    • 哦,是的,因为反斜杠也需要转义。我又编辑了。
    • 非常感谢您耐心回答问题,但问题仍然存在。食谱已成功上传到 Chef 服务器,但是,在 Chef 节点上运行的 chef-client 失败并出现以下错误:Error execution action 'run' on resource 'execute[stat]' Mixlib::ShellOut::ShellCommandFailed 预期进程退出使用 [0],但收到“1”
    【解决方案2】:

    出现此问题是因为 Windows 中的文件/文件夹名称不能包含冒号 (:) 字符。尝试通过 UI 或命令行手动创建文件。另请参阅 naming a file 以获取导致文件名无效的特殊字符列表。

    由于我们使用time.strftime("%Y-%m-%d%H:%M:%S") 创建时间戳,execute 块失败。将%H:%M:%S 更改为其他可接受的字符就足够了。

    另外,正如@Holger Just 在他的回答中指出的那样,我们需要使用双引号来插入time.strftime 的值。

    在下面的示例中,我使用了连字符 (-),即%H-%M-%S

    execute 'stat' do
      cwd 'D:\inetpub\TEST_APP'
      command "svn status > D:\SVN_CHECKOUT\REPORTS\CHEFRPT_TESTREPO_#{time.strftime("%Y-%m-%d%H-%M-%S")}.txt"
    end
    

    【讨论】:

    • 感谢您的解决方案。 %H-%M-%S 不起作用。它仍然给出了同样的错误。但是,我尝试了另一种方法。使用临时文件名生成报告,然后使用 cmd 命令以日期格式重命名文件。后来在 SVN 中添加并提交了这个文件。一条更长的路线,但它奏效了。
    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多