0

我是一名 Linux 用户,工作时被迫在 Windows 工作站上工作。我有一个为 bash 编写的脚本,我需要将其转换为 Windows Batch。过去,我没有太多麻烦,但现在我遇到了两个我无法弄清楚的问题。这是原始的 Linux 脚本:

#!/bin/bash
if [ $# != 1 ] ; then
    echo "usage: createMavenDirs.sh <name>"
    exit 1
fi
timestamp=`date +"%Y-%m-%d-%s"`
projectName="${1}_${timestamp}"
groupID="com.hostname"
version="1.0"
pomFill="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project>\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>${groupID}.${1}</groupId>\n\t<artifactId>${1}</artifactId>\n\t<name>\${artifactId}</name>\n\t<version>${version}</version>\n</project>"

clear

mkdir -p ${projectName}/src/{main/{java,resources,filters,assembly,config,webapp},test/{java,resources,filters},site}
touch ${projectName}/{LICENSE,NOTICE,README}.txt
touch ${projectName}/pom.xml
echo -e ${pomFill} > ${projectName}/pom.xml

tree ${projectName}

exit 0

首先,我想说“是的”,我知道有工具可以做到这一点,但由于工作中非常严格的限制,我必须使用这样的选项。其次,这是我遇到的两个问题。

  1. “mkdir”行:Windows 有没有办法像 Linux 一样做到这一点?

  2. 我在其中创建 pom 文件的“回显”行:Windows 能否回显换行符和制表符,并将其重定向到外部文件中,就像我在 Bash 脚本中所做的那样?

就像我说的,我知道还有其他方法可以做到这一点,但是那些力量迫使我走上了这条路。无论如何,感谢所有花时间阅读的人。

祝你有美好的一天 :-)

更新:我意识到 Windows 确实有“echo”和“mkdir”,但我需要能够以非常特定的方式使用它们,就像我在我的 Linux 脚本中使用它们一样。具体来说,我想创建与我在 Linux 脚本中完全相同的目录,并且我需要将换行符 '\n' 或 '\r' 和制表符 '\t' 回显到外部文件中。

更新 2:我无法安装任何新软件/实用程序/等。到我的工作站上。我必须只使用那里的东西。

4

3 回答 3

2

@brice 是对的,Windows 上的批处理编程非常疯狂。但我相信你仍然可以让它工作,虽然它不会是一个行到行的等价物。

需要担心的事情:

  • 时间戳取决于区域设置。我有法文版,请调整
  • 要输出标签,您必须在记事本中插入标签并将它们留在那里。HTML 会吃掉我原始脚本中的标签。
  • 如果您将选项卡作为第一个字符回显,则点 (.) 是强制性的
  • 我没有找到你从哪里获得工件 ID

据我所知,这个批处理文件和你的原始脚本做同样的事情:

@echo off

setlocal

if "%1"=="" (
    echo usage: createMavenDirs.bat ^<name^>
    goto:eof
)

::BEWARE: %date% and %time% are locale dependant, 
::I get 2012-04-27113505,55 YMMV
set timestamp=%date%%time::=%
set projectName=%1_%timestamp:,=%
set groupID=com.hostname
set version=1.0
set artifactId=What_is_this

::Create root dir
md "%projectName%"

::Make everything relative to %projectName%
pushd "%projectName%"

::Generate the pom file
(
echo.^<?xml version="1.0" encoding="UTF-8"?^>
echo.^<project^>
echo.   ^<modelVersion^>4.0.0^</modelVersion^>
echo.   ^<groupId^>%groupID%.%1^</groupId^>
echo.   ^<artifactId^>%1^</artifactId^>
echo.   ^<name^>\%artifactId%^</name^>
echo.   ^<version^>"%version%"^</version^>
echo.^</project^>
) > pom.xml

::Loop unrolling !
md src
    cd src
    md main
        cd main
        md assembly config filters java resources webapp
        cd ..
    md site
    md test
        cd test
        md filters java resources
        cd ..
    cd ..


::This is touch: copy /b LICENCE.txt +,, 
::but it will not create the file. Use this echo trick instead
echo. 2>LICENCE.txt
echo. 2>NOTICE.txt
echo. 2>README.txt

::Leave %projectName%
popd 

::Display dirs and files
tree /a /f "%projectName%"

endlocal

我从来没有在批处理脚本中使用循环展开;)

于 2012-04-27T17:37:36.573 回答
1

更新后:

基本上没有办法用批处理文件来做你要求的事情。

批处理文件损坏。咬紧牙关,使用 Java。(或者使用 Jython 作弊……)

原来的:

  1. windows to 的等效命令mkdirmdor mkdir

    c:\>mkdir \foo\bar
    
    c:\>dir
    [...]   foo  [...]
    
  2. echo也可以批量购买:

    c:\>echo some text> Myfile.txt
    
    c:\>type Myfile.txt
    some text
    
    c:\>
    

    请注意问题:引号也会出现在您的脚本中。例如,echo "abcdef"也会打印双引号。

    据我了解,该echo命令不支持制表符转义。

您可以在此批次参考中了解更多信息。

顺便说一句,如果可以的话,我建议通过Cygwin在 Windows 上运行 bash ......如果你有 Python,那也可能是救命稻草。如果这些选项都不可用,我会为你感到......

于 2012-04-27T14:15:45.877 回答
-4

您可以使用 cygwin 或 mingw 在 Windows 上运行 bash

于 2012-04-27T17:44:10.413 回答