0

私は職場で Windows ワークステーションで作業することを余儀なくされている Linux ユーザーです。bash 用に作成したスクリプトを Windows Batch に変換する必要があります。以前はそれほど問題はありませんでしたが、今では理解できない問題が 2 つあります。元の 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

まず、「はい」と言いたいのですが、これを行うためのツールがあることは知っていますが、職場では非常に厳しい制約があるため、このようなオプションを使用する必要があります。第二に、ここに私が抱えている2つの問題があります。

  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 の同等のコマンドmkdirmd、 または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 に答える