Windows:基于XML文件创建文件夹结构

时间:2016-01-20 11:59:20

标签: xml powershell batch-file directory

我正在尝试根据XML文件输入找到在Windows中创建完整文件夹/子文件夹/文件(快捷方式)arborescence的方法。

我的XML看起来像这样:

<# : Batch Portion
@echo off & setlocal

powershell -noprofile -noexit -noninteractive "iex (gc \"%~f0\" | out-string)"
goto :EOF

: End Batch / begin PowerShell hybrid chimera #>

[xml]$DOM = gc clv.xml
$destPath="D:\Test\Folders"

function CreateShortcut([string]$target, [string]$saveLoc, [string]$fileName) {

$aspxText= @"
<html>
<body>
<a href="$target">Target URL</a>
</form>
</body>
</html>
"@  
try{
New-Item ($saveLoc+'/'+$fileName+'.aspx') -type file -value  $aspxText -ea Stop
}
catch{
$err=@"
Name:
$fileName
Url:
$target

Error:
$_.Exception.GetType().FUllname
"@

New-Item ($saveLoc+'/###Error.txt') -type file -value  $txtDoc
}

    write-host "$($saveLoc)\$($fileName)" -f cyan
}

cd $destPath
function launchCreation($root){
    $rootshortcuts = @($root.shortcut)
    if($rootshortcuts -ne $null){
        foreach ($shortcut in $rootshortcuts) {
            $fixedShortcutName=$shortcut.name  -replace '[<>:"\/\\?\*\|]', '-'
            $urlfile = (pwd).Path
            CreateShortcut $shortcut.url $urlfile $fixedShortcutName $shortcut.isDoc $shortcut.isTaxo
        }
    }
    Walk($root)
}
function Walk($root) {  
    $folders = @($root.folder)
    if($folders -ne $null){
        foreach ($folder in $folders) {
            $folderName=$folder.name -replace '[<>:"\/\\?\*\|]', '-'
            if (-not (test-path $folderName)) {  md $folderName }
            cd $folderName
            write-host (Join-Path $destPath $folderName) -f magenta
            $shortcuts = @($folder.shortcut)
            if($shortcuts -ne $null){
                foreach ($shortcut in $shortcuts) {
                    $fixedShortcutName=$shortcut.name  -replace '[<>:"\/\\?\*\|]', '-'
                    $urlfile = (pwd).Path
                    CreateShortcut $shortcut.url $urlfile $fixedShortcutName $shortcut.isDoc $shortcut.isTaxo
                }
            }
            Walk $folder
            cd..
        }
    }

}

[void](launchCreation $DOM.documentElement)

结果文件夹为:

  • Folder1中
    • A.url
    • B.url
    • Folder1.1
      • C.url
    • Folder1.2
      • D.url
  • FOLDER2
    • ...

- &GT;总结一下,创建递归文件夹/子文件夹,以及创建快捷方式(.url文件)

有关如何做到这一点的任何想法? 通过cmd,powershell?

(如果.url文件创建不可能,我会手动制作(超过300 ...)

非常感谢!

编辑:解决方案

谢谢@rojo,好方向。 我已经修改了html文件创建“快捷方式”的需要。 (此处截断的内容仅用于示例) 我添加了一个目标路径,几个错误处理(文件夹和文件创建,通过创建错误txt文件,可以轻松搜索以手动修复),以及添加根文件的创建。 (不在子文件夹中)

可能没有很好的优化,但很好......

 $diff_ips = array_unique($ip_array);
    $ip_with_date = [];
    foreach ($diff_ips as $ip) {
        $get_dates = shell_exec("grep $ip $path" . $inputs['domain'] . ".log |     awk '{print $4}'");
        $new_date = str_replace('[', '', $get_dates);
        $array_date = explode("\n", $new_date);
        array_pop($array_date);

        foreach ($array_date as $dates) {
            $formed_date[] = date('Y-m-d, H:m:s', strtotime(str_replace('/', '-',   $dates)));
        }

        $ip_with_date[] = [
            'ip' => $ip,
            'all_dates' => $formed_date
        ];

    }

3 个答案:

答案 0 :(得分:1)

挑战已被接受,但仅限于阻止他人尝试将XML解析为平面文本以进行标记化和删除。将来,请努力编写自己的代码,并在寻求帮助时发布您所写的内容。

我掀起了一个快速而又脏的PowerShell脚本,可以满足您的需求。它将XML作为XML对象导入,然后递归遍历DOM,创建不存在的目录并创建快捷方式。 XML 必须格式正确且有效。

这是我用来测试脚本的XML:

<?xml version="1.0"?>
<root>
    <folder name="Folder1">
        <shortcut url="http://A.com" name="A" />
        <shortcut url="http://B.com" name="B" />
        <folder name="1.1">
            <shortcut url="http://C.com" name="C" />
        </folder>
        <folder name="Folder1.2">
            <shortcut url="http://D.com" name="D" />
        </folder>
    </folder>
    <folder name="Folder2">
        <shortcut url="http://E.com" name="E" />
    </folder>
</root>

这是.PS1脚本:

[xml]$DOM = gc folders.xml
$shell = New-Object -COM WScript.Shell

function CreateShortcut([string]$target, [string]$saveLoc) {
    $shortcut = $shell.CreateShortcut($saveLoc + ".url")
    $shortcut.TargetPath = $target
    $shortcut.Save()
    write-host $shortcut.FullName -f cyan
}

function Walk($root) {
    foreach ($folder in $root.folder) {
        if (-not (test-path $folder.name)) { md $folder.name }
        cd $folder.name
        write-host (pwd).Path -f magenta
        foreach ($shortcut in $folder.shortcut) {
            $urlfile = ((pwd).Path, $shortcut.name) -join '\'
            CreateShortcut $shortcut.url $urlfile
        }
        Walk $folder
        cd ..
    }
}

[void](Walk $DOM.documentElement)

如果您更愿意使用.bat脚本,只需将此注释块插入脚本顶部并为该事物添加.bat扩展名:

<# : Batch Portion
@echo off & setlocal

powershell -noprofile -noninteractive "iex (gc \"%~f0\" | out-string)"
goto :EOF

: End Batch / begin PowerShell hybrid chimera #>

答案 1 :(得分:0)

这种类型的问题很容易通过递归过程解决。下面的解决方案只是显示 md&amp;创建文件夹结构所需的cd个命令;如果结果看起来正确,请从每个命令中删除ECHO部分。我希望这种方法很简单,所以不需要解释。

@echo off
setlocal EnableDelayedExpansion

call :treeProcess < input.xml
goto :EOF


:treeProcess
   set "line=:EOF"
   set /P "line="
   for /F "tokens=1-5 delims=<=> " %%a in ("%line%") do (
      if "%%a" equ "folder" (
         ECHO md "%%~c"
         ECHO cd "%%~c"
         call :treeProcess
      ) else if "%%a" equ "shortcut" (
         echo Create here "%%~e.url"
      ) else if "%%a" equ "/folder" (
         ECHO cd ..
         exit /B
      )
   )
if "%line%" neq ":EOF" goto treeProcess
exit /B

这是输入提供的输出:

md "Folder1"
cd "Folder1"
Create here "A.url"
Create here "B.url"
md "1.1"
cd "1.1"
Create here "C.url"
cd ..
md "Folder1.2"
cd "Folder1.2"
Create here "D.url"
cd ..
cd ..
md "Folder2"
cd "Folder2"
cd ..

答案 2 :(得分:-1)

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q3489447.txt"
PUSHD "%destdir%"
FOR /f "usebackqtokens=*" %%z IN ("%filename1%") DO (
 FOR /f "tokens=1-6delims=<=>" %%a IN ('echo "%%z"') DO (
  IF "%%~b"=="shortcut url" CALL :mdshortcut %%d
  IF "%%~b"=="folder name" MD "%%c"&CD "%%c"
  IF "%%~b"=="/folder" CD ..
 )
)
POPD

GOTO :EOF

:mdshortcut
MD "%~1.url"
GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。

我使用了一个名为q3489447.txt的文件,其中包含我的测试数据。

  • 转到目标目录
  • 阅读文件;将前导空格剥离到%%z
  • 使用适当的分隔符,将行分成几部分
  • 如果第二部分是folder name,则创建一个新目录并更改为
  • 如果第二部分是/folder,则返回一个目录级别。
  • 如果第二部分是shortcut url,则调用传递第四部分的子例程,其中第一部分是附加.url的所需新目录名。
  • 完成后返回原始目录

您可以将2>nul附加到md命令,以取消对目录已存在的投诉。