我正在尝试在PowerShell中编写一个脚本,它在C:盘上收集可用空间,然后将其附加到网络驱动器上的.csv文件中。
默认情况下,我们公司没有启用PowerShell。远程PowerShell命令受到限制。因此,我必须编写脚本,然后使用PsExec启动它们。
我有两个脚本用于此过程。第一个是我从我的机器上运行的那个,这个脚本要求我的凭据,然后使用foreach循环循环一个带有IP地址的.txt文件,告诉每个IP从网络驱动器启动第二个脚本。第二个脚本收集可用空间,对其执行数学函数,然后将主机名和可用空间附加到网络上的.csv文件中。
但是,第二个脚本永远不会运行。使用PsExec建立连接后,我的控制台就坐在那里。它应该启动脚本然后再循环到下一个IP。我已经在一些目标机器上手动测试了第二个脚本而没有任何问题。
本地执行的脚本:
$username = Read-Host "Username"
$outputPath = "\\network\directory\sub-directory\FileName.csv"
$IPpath = Read-Host "Enter the path for the list of IP addresses"
$IPs = Get-Content -Path $IPpath
Add-Content -Path $outputPath -Value """IP"",""Free Space"""
foreach ($IP in $IPs)
{
if (Test-Connection -Count 1 -ComputerName $IP -Quiet)
{
\\network\directory\subdirectory\psexec.exe -accepteula \\$IP -u domain\$username -h PowerShell -ExecutionPolicy Bypass -Command \\network\directory\sub-directory\diskSpaceCheck.ps1
}
else
{
Add-Content -Path $outputPath -Value """$IP"",""Offline"""
}
}
远程执行的脚本(diskSpaceCheck.ps1):
$outputPath = "\\network\directory\sub-directory\FreeSpace.csv"
$hostname = hostname
$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'"
$freeSpace = [System.Math]::Round((($disk.FreeSpace) / 1GB))
Add-Content -Path $outputPath -Value "$($hostname), $($freeSpace)"
我不认为你可以在foreach中有一个if语句,但我已经尝试过没有if测试并得到相同的结果。我无法弄清楚为什么远程机器不会执行此脚本。我有另一个脚本被复制到这些机器,然后以正常工作的相同方式执行。
此外,目标计算机被锁定以限制其仅用于特定目的。这些计算机使用通用自动登录,通常可以访问一些应用程序。其他一切都无法访问,包括Windows资源管理器,控制面板等。我在我办公室本地的一些机器上测试了这个脚本,它工作正常。
我在考虑网络延迟问题?这会影响PsExec或.ps1脚本吗?我可以远程登录到计算机,注销,使用我的凭据登录并运行脚本,而PsExec只是运行我给它的命令。
任何建议都将受到赞赏。
答案 0 :(得分:1)
如果您使用PSExec直接执行Ps1文件,则会发生这种情况。而是使用PSexec执行PowerShell.exe并将ps1文件作为参数传递。
另请查看此问题:Run PowerShell on remote PC
答案 1 :(得分:0)
我明白了。脚本正在运行,但它只是坐在那里等待另一个命令。我在远程运行的脚本中添加了一个stop-process命令。
Stop-Process -Name powershell
现在它运行,然后以错误代码-1退出。