在 windows 中复制 DOORS 结构
Replicating DOORS structure in windows
我正在尝试创建一个脚本,它将在 windows 文件结构中复制 DOORS 结构。这个想法是 运行 脚本并将文件夹结构从当前位置向下复制到用户选择的 windows 文件夹结构中。我是 DXL 的新手,但我找到了 mkdir() 函数。使用它时,我似乎在给它一个完整的文件路径时遇到问题,即 C:\output\folder1\ 。在这种情况下,它不会正确创建结构,除非 C:\output 已经存在。
我的问题是,有没有一种方法可以一次创建多个文件夹级别,或者有更好的方法吗?
您想首先创建基本级别的文件夹(在脚本中或外部),然后在 DOORS 中循环遍历每个 Project/Folder 时,为该项目创建一个文件夹。例如:
mkdir("C:/output")
string p_name = ""
Item i
Project p
for p_name in database do {
mkdir("C:/output/" p_name)
p = project(p_name)
for i in p do {
if((type(i) "" == "Folder") || (type(i) "" == "Project")) {
mkdir("C:/output/" fullName(i))
}
}
}
这应该可以帮助您入门,我没有时间对其进行测试,但您可以根据需要对其进行修改。
史蒂夫的回答是正确的,尽管在我的情况下使用递归更有意义,因为我还必须做一些其他事情。
此代码是根据我在 IBM Developer Works 论坛上找到的版本修改的,但我找不到源代码,如果我再次找到它,我会link它
void RecurseFolder(Folder fld)
{ // Deal RECURSIVELY with sub-folders, and then all modules in this folder
if (!fileExists_(g_base_dir "\" name(fld)) && !(name(current) == name(fld)))
{
mkdir(g_base_dir "\")
}
Skip skpItems = createString()
Item itm
string NameItem
Folder fldNew
// Stage in Skip, key is name which is Alpha order
for itm in fld do
{
put (skpItems, fullName(itm), itm)
}
// Recurse through sub-folders
for itm in skpItems do
{
string base_dir = g_base_dir
NameItem = (string key skpItems)
if (type(itm) == "Folder" or type(itm) == "Project")
{
fldNew = folder(NameItem)
g_base_dir = g_base_dir "\" name(fldNew)
RecurseFolder(fldNew) // *** RECURSION ***
g_base_dir = base_dir
}
else if (type(itm) == "Formal")
{
//open module for reading - silent mode, standard view
Module m = read(fullName(itm), false, true)
if (NameItem != "")
{
if (!null export(base_dir "\" name(itm) ".xml"))
{
errorBox "Export failed! - \n" base_dir "\" name(itm) ".xml"
}
}
//if module is not visible
if (!isVisible(m))
{
// close it to improve performance
close m
}
}
else {} //Nothing to do
}
delete(skpItems)
} // end RecurseFolder()
我正在尝试创建一个脚本,它将在 windows 文件结构中复制 DOORS 结构。这个想法是 运行 脚本并将文件夹结构从当前位置向下复制到用户选择的 windows 文件夹结构中。我是 DXL 的新手,但我找到了 mkdir() 函数。使用它时,我似乎在给它一个完整的文件路径时遇到问题,即 C:\output\folder1\ 。在这种情况下,它不会正确创建结构,除非 C:\output 已经存在。
我的问题是,有没有一种方法可以一次创建多个文件夹级别,或者有更好的方法吗?
您想首先创建基本级别的文件夹(在脚本中或外部),然后在 DOORS 中循环遍历每个 Project/Folder 时,为该项目创建一个文件夹。例如:
mkdir("C:/output")
string p_name = ""
Item i
Project p
for p_name in database do {
mkdir("C:/output/" p_name)
p = project(p_name)
for i in p do {
if((type(i) "" == "Folder") || (type(i) "" == "Project")) {
mkdir("C:/output/" fullName(i))
}
}
}
这应该可以帮助您入门,我没有时间对其进行测试,但您可以根据需要对其进行修改。
史蒂夫的回答是正确的,尽管在我的情况下使用递归更有意义,因为我还必须做一些其他事情。
此代码是根据我在 IBM Developer Works 论坛上找到的版本修改的,但我找不到源代码,如果我再次找到它,我会link它
void RecurseFolder(Folder fld)
{ // Deal RECURSIVELY with sub-folders, and then all modules in this folder
if (!fileExists_(g_base_dir "\" name(fld)) && !(name(current) == name(fld)))
{
mkdir(g_base_dir "\")
}
Skip skpItems = createString()
Item itm
string NameItem
Folder fldNew
// Stage in Skip, key is name which is Alpha order
for itm in fld do
{
put (skpItems, fullName(itm), itm)
}
// Recurse through sub-folders
for itm in skpItems do
{
string base_dir = g_base_dir
NameItem = (string key skpItems)
if (type(itm) == "Folder" or type(itm) == "Project")
{
fldNew = folder(NameItem)
g_base_dir = g_base_dir "\" name(fldNew)
RecurseFolder(fldNew) // *** RECURSION ***
g_base_dir = base_dir
}
else if (type(itm) == "Formal")
{
//open module for reading - silent mode, standard view
Module m = read(fullName(itm), false, true)
if (NameItem != "")
{
if (!null export(base_dir "\" name(itm) ".xml"))
{
errorBox "Export failed! - \n" base_dir "\" name(itm) ".xml"
}
}
//if module is not visible
if (!isVisible(m))
{
// close it to improve performance
close m
}
}
else {} //Nothing to do
}
delete(skpItems)
} // end RecurseFolder()