如何使用batch脚本循环获取IIS站点数据实现迁移自动化
实现方案
核心通过batch自带的for /f命令解析appcmd的输出结果,同时提取站点ID、名称等字段,处理后拼接生成压缩包文件名。
可用Batch脚本示例
@echo off setlocal enabledelayedexpansion :: 定义appcmd工具的绝对路径,避免环境变量异常 set "APPCMD=C:\Windows\System32\inetsrv\appcmd.exe" :: 遍历所有站点,同时提取站点ID、站点名称两个字段 for /f "tokens=1,2 delims=|" %%a in ('%APPCMD% list sites /text:id /text:name') do ( set "site_id=%%a" set "site_name=%%b" :: 替换站点名称中不允许作为文件名的特殊字符 set "safe_name=!site_name:/=_!" set "safe_name=!safe_name:\=_!" set "safe_name=!safe_name::=_!" set "safe_name=!safe_name:?=_!" set "safe_name=!safe_name:"=!" :: 拼接生成压缩包文件名,可按需修改格式 set "zip_file=!site_id!_!safe_name!_iis_backup.zip" echo 处理站点:ID=!site_id!,名称=!site_name!,备份文件名=!zip_file! :: 此处插入你后续的压缩、迁移命令,比如调用7z、系统tar等工具执行打包 ) endlocal
关键逻辑说明
for /f命令通过delims=|分割appcmd多字段输出结果,tokens=1,2对应依次输出的站点ID、站点名称两个参数,你可以按需追加/text:physicalPath等参数获取更多站点属性,同步调整tokens数量即可- 开启
enabledelayedexpansion延迟变量扩展,保证循环内的变量赋值可以实时读取 - 提前替换站点名称中的非法文件名字符,避免生成压缩包时出现文件名无效报错
备选方案(PowerShell实现更简便)
如果允许使用PowerShell,代码逻辑更简洁,无需处理复杂的变量扩展和字符分割:
# 遍历所有IIS站点 Get-Website | ForEach-Object { # 替换非法文件名字符,拼接压缩包名 $zipName = "$($_.Id)_$($_.Name -replace '[\\/:*?"<>|]','_')_backup.zip" # 后续执行打包、迁移逻辑即可 }
内容的提问来源于stack exchange,提问作者shashi
相关产品推荐
相关产品推荐

