powershell - Powershell:基于动态菜单的程序来复制文件
问题描述
这样做的目的是将一个(或多个)文件从一个用户选择的动态位置复制到另一个用户选择的动态位置。
Write-Host "Choose where to copy FROM"
$1MainFolder = (Get-ChildItem "C:\Users\$env:USERNAME\FROM" -Directory | Sort-Object)
$menu = @{}
for ($i=1;$i -le $1MainFolder.count; $i++) {
Write-Host "$i. $($1MainFolder[$i-1].name)"
$menu.Add($i,($1MainFolder[$i-1].name))
}
[int]$ans = Read-Host 'Enter selection'
$selection = $menu.Item($ans)
# The directory after the selection is only one, however it's different for every user; this remains the same for "COPY TO"
$First = (Get-ChildItem "C:\Users\$env:USERNAME\FROM\$selection" -Directory)
# This directory is the same for every user; this remains the same for "COPY TO"
$DataFROM = (Set-Location $First\USERFILE)
Clear-Host
Write-Host "Choose where to copy TO"
$2MainFolder = (Get-ChildItem "C:\Users\$env:USERNAME\TO" -Directory | Sort-Object)
$menu2 = @{}
for ($i=1;$i -le $2MainFolder.count; $i++) {
Write-Host "$i. $($2MainFolder[$i-1].name)"
$menu2.Add($i,($2MainFolder[$i-1].name))
}
[int]$ans2 = Read-Host 'Enter selection'
$selection2 = $menu2.Item($ans2)
$Second = (Get-ChildItem "C:\Users\$env:USERNAME\TO\$selection2" -Directory)
$DataTO = (Set-Location $Second\USERFILE)
Clear-Host
这样就完成了第一节和第二节。第三部分允许用户然后选择他们想要复制的文件 - 这是一个单独的功能,效果很好,但是它与此一起出错。我已经简化了函数以获得相同的错误:
# The Select-Object section being the simplified part...
Get-ChildItem $DataFROM | Select-Object "DATA.log*" | Copy-Item -Destination $DataTO
我期望发生的是将数据从初始动态位置复制到最终动态目的地。
发生的情况是我收到一条错误消息,指出它“无法将参数绑定到参数'Path',因为它是一个空字符串。” 它指向 $DataTO 变量。
这导致我忽略第三部分并测试我发现的变量,如果我在前两个部分之后使用以下内容:
Get-ChildItem $DataFROM
# or
Get-ChildItem $DataTO
它从最后选择的菜单返回信息,完全忽略变量。那么动态菜单是否不能以这种方式使用,或者我使用的菜单有误?
有人可以告诉我我在哪里误入歧途了吗?
解决方案
更新:我已经将它重新设计为符合我所要求的需求的以下内容:(希望这将有助于其他需要类似东西的人)
[array]$sMainFolder = Get-ChildItem "C:\Users\$env:USERNAME\DATA-TO_FROM" -Directory | ForEach-Object {
Get-ChildItem $_.FullName | ForEach-Object {
$found = Get-ChildItem $_.FullName | Where-Object { $_.Name -eq 'USERFILE' } | Select-Object -First 1
if ($found) {
[PSCustomObject]@{
RootFolder = [string]$_.FullName
Path = $found.FullName
}
}
}
}
[array]$dMainFolder = Get-ChildItem "C:\Users\$env:USERNAME\DATA-TO_FROM" -Directory | ForEach-Object {
$subs = Get-ChildItem $_.FullName
$found = $subs | ForEach-Object { Get-ChildItem $_.FullName } | Where-Object { $_.Name -eq 'USERFILE' } | Select-Object -First 1
if ($found) {
[PSCustomObject]@{
RootFolder = [string]$_.FullName
Path = $found.FullName
}
}
}
function ShowMenu ($Folders, $Message) {
Write-Host $Message
for ($i = 1; $i -le $Folders.count; $i++) {
$name = $Folders[$i - 1].RootFolder
Write-Host "$i. $name"
}
[int]$ans = Read-Host 'Enter Selection'
Return $Folders[$ans -1].Path
}
$DataFROM = ShowMenu $sMainFolder "Choose where to copy FROM"
$DataTO = ShowMenu $dMainFolder "Choose where to copy TO"
Clear-Host
Copy-Item "$DataFROM\*" $DataTO -Recurse -Force
推荐阅读
- powershell - 在 Powershell 中添加返回文件夹大小的函数
- javascript - 使用javascript在另一个字符串中查找字符串的位置
- nginx - 以另一个用户身份在 Windows 上运行 nginx.exe
- spring - 如何在 Spring 中提供授权。由 KeyCloak 完成的云网关
- javascript - document.body.scrollHeight 与 document.documentElement.scrollHeight 之间的区别
- ethereum - 在以太坊中广播没有初始余额的代币 ID 的存在有什么意义?
- reactjs - 如何使用 redux 正确响应失败操作?
- docker - 当 docker 镜像不是你制作的时候,如何通过 VNC 连接到 docker?
- javascript - 单击链接时,我想在下一页上显示价值/价格
- c++ - 您如何描述对 std::array 的底层数据成员的直接访问?