我正在尝试根据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)
结果文件夹为:
- &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
];
}
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为q3489447.txt
的文件,其中包含我的测试数据。
%%z
folder name
,则创建一个新目录并更改为/folder
,则返回一个目录级别。shortcut url
,则调用传递第四部分的子例程,其中第一部分是附加.url
的所需新目录名。您可以将2>nul
附加到md
命令,以取消对目录已存在的投诉。