我的目标是编写一个批处理脚本,删除特定缓存服务器中的所有缓存名称。
我在下面编写的代码错误,因为它无法执行AppFabric PowerShell命令。它返回"Remove-Cache -CacheName blahblah" is not a recognized as an internal or external command
。
我想我需要弄清楚我需要你们帮助的是我如何使用shell脚本FOR /F
命令但是能够执行AppFabric PowerShell命令。
我尝试添加一行:
powershell.exe -noexit -command "Import-Module DistributedCacheAdministration;Use-CacheCluster"
在批处理脚本的开头首先打开PowerShell窗口,导入AppFabric模块,然后运行批处理脚本。但是因为PowerShell并不认识FOR /F
,所以它会在那里轰炸。我试图删除多个cachenames,但我还不够先进。帮助!
:
@echo off
REM using PING and batch line retrieval... only IP address info is called out from ping request
FOR /F "tokens=2,3" %%A IN ('ping %computername% -n 1 -4') DO IF "from"== "%%A" set "IP=%%~B"
echo %IP:~0,-1%
REM GET-CacheClusterHealth > C:\output.txt
REM FIND /n /i "NamedCache" C:\output.txt > C:\results.txt
FOR /F "tokens=4" %%i in (C:\results.txt) DO "Remove-Cache -CacheName %%i"
DEL "C:\output.txt"
DEL "C:\results.txt"
ECHO ALL Cache names have been deleted from Cache Server %IP:~0,-1%
Pause
答案 0 :(得分:0)
老实说,看起来你正在变得比它需要的更复杂。 PowerShell是移动的方式,因此您可能希望了解它的工作原理。您可能需要的是(伪代码的类型,因为我没有要引用的实际cmdlet):
Import-Module DistributedCacheAdministration
Use-CacheCluster
$ServerName = "SomeServer01"
$ServerPort = "22233"
Get-Cache -HostName $ServerName -CachePort $ServerPort | ForEach{Remove-Cache $_.CacheName}
现在我不知道从Get-Cache
返回了什么,但我想它会返回一系列内容,并且通过查看您的脚本,其中一个属性是NamedCache,这是您想要使用的内容。上面的示例将导入执行命令所需的模块。然后,它将缓存集群设置为当前主机,将变量分配给要使用的服务器的名称,然后为该端口分配另一个变量。最后,它对指定的主机和端口执行Get-Cache命令,并将结果发送到ForEach循环,该循环对返回的所有项目的NamedCache属性执行Remove-Cache命令。正如我之前所说,我假设它返回一个包含NamedCache属性的对象数组。
至于PowerShell中的FOR /F
,如果你真的想要走这条路,你可以做的是:
Get-Content Results.txt | ForEach{Remove-Cache -CacheName $_.Split(" ")[3]}
获取文件的内容,然后对于每一行,它在每个空格处分割该行,并引用第4项(PowerShell的Split方法将字符串转换为字符串数组,并且因为数组从记录0开始在PowerShell中[3]
引用数组中的第4个字符串。)