2016-04-23 9 views
4

小さなコード生成タスクにPowerShellを使用しようとしています。私はスクリプトにいくつかのJavaクラスとインタフェースを生成させたい。宣言した後、ここで文字列を再評価することは可能ですか?

スクリプトでは、ここで文字列変数を宣言したいと思います。例:

$controllerContent = @" 
package controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 

@Controller 
@EnableWebMvc 
public class $completeName { 

} 
"@ 

宣言の後、変数$completeNameを計算する関数に渡したいと思います。しかし、私は文字列内の変数を置き換える適切な方法は何もありません。 -replaceを使用する必要がありますか?それとも別の方法がありますか?

答えて

3

私は通常の形式という文字列を使用します。あなたがやらなければならないことは、{0}$completeNameを置き換えるために、あなたが文字列をいつでもフォーマットすることができます:

$controllerContent = @" 
package controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 

@Controller 
@EnableWebMvc 
public class {0} {{ 

}} 
"@ 

今、あなたが使用して、クラスの名前を変更することができます

$controllerContent -f 'MyController' 

:のみdownsiteにします私の例に示すように中括弧をエスケープする必要があるということです。したがって、フォーマット文字列か-replaceを使用するかどうかを選択します。

4

私は通常、上記のようなフォーマット文字列を使用しますが、scriptblockでラップして必要に応じて呼び出すこともできます。それは、テキストそのものを変更する必要はありません。例:

$completeName = "HelloWorld" 

$controllerContent = { @" 
@Controller 
@EnableWebMvc 
public class $completeName { 

} 
"@ } 

& $controllerContent 
#Save the string: $str = & $controlledContent 

出力:

@Controller 
@EnableWebMvc 
public class HelloWorld { 

} 

変更変数:

$completeName = "HelloNorway" 

& $controllerContent 

出力:

@Controller 
@EnableWebMvc 
public class HelloNorway { 

} 
+0

非常に良いアイデア。 –

1

ヘルプの人々に感謝します。興味のある方は、これは私が思いついたスクリプトです...

Param(
    [Parameter(Mandatory=$True)] 
    [string]$name 
) 
$sourceDir = "..." 
$classNameGeneration = {param($name,$type)Return "$name"+ ($type.Substring(0,1)).ToUpper()+($type.Substring(1))} 
$interfaceNameGeneration = {param($name,$type)Return "$name"+($type.Substring(0,1)).ToUpper()+($type.Substring(1))+"IF"} 

$controllerName = & $classNameGeneration -name $name -type controller 
$serviceInterfaceName = & $interfaceNameGeneration -name $name -type service 
$serviceName = & $classNameGeneration -name $name -type service 
$daoInterfaceName = & $interfaceNameGeneration -name $name -type dao 
$daoName = & $classNameGeneration -name $name -type dao 

function create($name, $type, $content) { 
    $dir = $sourceDir+"\$type" 
    $fileName = $name+".java" 
    $filePath = "$dir\$fileName" 
    cd $dir 
    New-Item $filePath -ItemType file 
    Set-Content $filePath $content 
} 

"[INFO]create controller class..." 
$controllerContent = @" 
package controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.beans.factory.annotation.Autowired; 

@Controller 
@EnableWebMvc 
public class {0} {{ 

@Autowired 
private {1} service; 

}} 
"@ 
$controllerContent = $controllerContent -f $controllerName,$serviceInterfaceName 
create $controllerName controller $controllerContent 

"[INFO]Create service interface..." 
$serviceInterfaceContent = @" 
package service; 

public interface {0} {{ 

}} 
"@ 
$serviceInterfaceContent = $serviceInterfaceContent -f $serviceInterfaceName 
create $serviceInterfaceName service $serviceInterfaceContent 

"[INFO]Create service class..." 
$serviceContent = @" 
package service; 

import org.springframework.beans.factory.annotation.Autowired; 

public class {0} implements {1} {{ 

@Autowired 
private {2} dao; 
}} 
"@ 
$serviceContent = $serviceContent -f $serviceName,$serviceInterfaceName,$daoInterfaceName 
create $serviceName service $serviceContent 
"[INFO]Create dao interface..." 
$daoInterfaceContent = @" 
package dao; 

public interface {0} {{ 

}} 
"@ 
$daoInterfaceContent = $daoInterfaceContent -f $daoInterfaceName 
create $daoInterfaceName dao $daoInterfaceContent 
"[INFO]Create dao class..." 
$daoContent = @" 
package dao; 

public class {0} implements {1} {{ 

}} 
"@ 
$daoContent = $daoContent -f $daoName,$daoInterfaceName 
create $daoName dao $daoContent 
+0

いくつかのインポートを追加する必要があります。これを使ってテストクラスを作成することもできます... powershellは本当に面白いです。 – Patrick

関連する問題