【问题标题】:Convert Unix Shell Script to Windows Batch File将 Unix Shell 脚本转换为 Windows 批处理文件
【发布时间】:2012-02-02 23:59:55
【问题描述】:

我有一个可在 Unix 中运行的 shell 脚本 (.sh),但我想将其转换为 Windows 批处理文件 (.bat):

cat >flog.ctl <<_EOF
LOAD DATA
INFILE '$1.log' "str ';'"
APPEND INTO TABLE flog
fields terminated by '=' TRAILING NULLCOLS
(
filename constant '$1'
,num  char
,data char
)
_EOF

sqlldr <username>/<password>@<instance> control=flog.ctl data=$1.log

我对批处理文件不太了解,但如果答案是一些提示而不是完整的解决方案,那么我相信我会应付自如。这是为了帮助回答另一个问题here

【问题讨论】:

    标签: windows shell batch-file


    【解决方案1】:

    Windows 批处理文件不支持以这种方式内联数据。你必须

    ECHO firstLine > flog.ctl
    ECHO additionalLine >> flog.ctl
    

    Windows 批处理文件使用 % 符号表示 ECHO 语句中的变量,即 %1%。

    所以你得到的文件会是这样的:

    @ECHO OFF
    ECHO LOAD DATA > flog.ctl
    ECHO INFILE '%1%.log' "str ';'" >> flog.ctl
    ECHO APPEND INTO TABLE flog >> flog.ctl
    ECHO fields terminated by '=' TRAILING NULLCOLS >> flog.ctl
    ECHO ( >> flog.ctl
    ECHO filename constant '%1%' >> flog.ctl
    ECHO ,num  char >> flog.ctl
    ECHO ,data char >> flog.ctl
    ECHO ) >> flog.ctl
    
    sqlldr <username>/<password>@<instance> control=flog.ctl data=%1%.log 
    

    【讨论】:

    • @voithos 的代码中使用的%1%%1 之间有区别吗?我已经测试了两者并且都可以工作。
    • @JohnDoyle:第二个 % 不是必需的。我认为 James 可能习惯于使用两个符号来分隔批处理文件中的变量,like shown here。但据我所知,引用命令行参数的“正确”方法是use a single %
    • 嗨,@JohnDoyle。两种方式都不比另一种更正确。确实,您始终可以使用单个 % 引用参数变量 0-9,因为它们在扩展时会得到特殊处理。我总是习惯使用第二个 % ,因为当使用命名变量时,ECHO %Asometext%B 会输出错误,ECHO %A%sometext%B% 不会。试一试,你就会明白我的意思了。
    • @voithos 见我上面的评论。
    • @James:我还是更喜欢单一的 %。双 % 有效,因为命令行参数被映射到同名的环境变量。我喜欢区分参数和环境变量,而且我知道这样做的至少一个原因:%* 可以用作“所有参数”的简写,而%*% 是一个错误,只会给出 *.简而言之,即使您大部分时间都可以使用其中任何一种,但它们并不等同。
    【解决方案2】:

    就内联而言一些复杂的解决方案,但正如已经提到的,一个简单的解决方案是使用echo

    @echo off
    
    echo LOAD DATA > flog.ctl
    echo INFILE '%1.log' "str ';'" >> flog.ctl
    echo APPEND INTO TABLE flog >> flog.ctl
    echo fields terminated by '=' TRAILING NULLCOLS >> flog.ctl
    echo ( >> flog.ctl
    echo filename constant '%1' >> flog.ctl
    echo ,num  char >> flog.ctl
    echo ,data char >> flog.ctl
    echo ) >> flog.ctl
    
    sqlldr <username>/<password>@<instance> control=flog.ctl data=%1.log
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多