найти путь, а не файл с помощью PowerShell - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь найти путь, чтобы запустить команду. Я не хочу искать файл, а вместо этого ищу полное имя папки, включая букву диска. Часто буква диска пути меняется, поэтому мне нужно проверить несколько разных букв диска, чтобы найти папку, содержащую мои файлы.

Иногда файл будет существовать с тем же именем в нескольких местах с буквой диска. Это нормально, но мне нужно определить папку, в которой каждый из них сохранен. В настоящее время я создал этот уродливый однострочник, который работает, но не совсем то, что мне нужно ... Из-за того, что я не понял, как это сделать, я создал файл, который могу сохранить по пути, который мне нужно найти, так что у меня есть цель, которую я могу найти .... этот файл называется file.txt

get-childItem -path f:\,g:\,h:\ -recurse -include file.txt 

Некоторые устройства, на которых я запускаю это, не имеют всех дисков, поэтому возникает больше уродства, и я устанавливаю переменную и включите некоторые -erroraction, чтобы продолжить, даже если буква диска не найдена ...

$path= Get-ChildItem -Path f:\, g:\, h:\ -Recurse -Include file.txt -ErrorAction SilentlyContinue

Я уверен, что должен быть более элегантный способ достижения sh цели ... Я действительно просто хотите найти путь к папке, содержащей определенные c имена файлов, независимо от буквы диска. Мне не нужен файл file.txt или какой-либо другой код. Я просто хочу решить эту проблему и узнать, как лучше всего это сделать с помощью PowerShell. У меня есть достойный пакетный сценарий для этого, но я пытаюсь переписать его с помощью чистого PowerShell.

FOR %%i IN (C D E F G H I J K L N M O P Q R S T U V W X Y Z) DO (
    IF EXIST %%i:\scripts\file.txt (
        ECHO Script found at %%i
    )
)

Эта пакетная версия отлично работает, и я могу запустить свою команду и ссылаться на переменную %% i как на путь, по которому находится мой файл ... но я хочу преобразовать его в PowerShell.

Я видел некоторые другие темы на этом сайте, но я не добился большого прогресса, и я терплю неудачу .. Есть ли лучший путь?

$Drives = "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
foreach ($Drive in $Drives) {
   if (Test-Path "${Drive}:\file.txt") {
       $FileLocation = $Drive
   }
}

Write-Host $FileLocation

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Вы можете получить массив доступных дисков в системе, используя [System.IO.DriveInfo] :: GetDrives () . Из этого вы берете свойство Name и перебираете диски:

[System.IO.DriveInfo]::GetDrives().Name | ForEach-Object {
    (Get-ChildItem -Path $_ -Filter 'file.txt' -Recurse -File -ErrorAction SilentlyContinue).DirectoryName
}

Конечно, вы можете записать возвращенные пути к каталогам, если хотите:

$paths = [System.IO.DriveInfo]::GetDrives().Name | ...

Другой способ для получения доступных дисков с помощью WMI или CIM: (Get-CimInstance -ClassName Win32_logicaldisk).DeviceID, но помните, что возвращенные буквы дисков отформатированы C: без backsla sh

0 голосов
/ 09 июля 2020

Да, попробуйте это:

67..90|%{[char]$_}|%{if(test-path "$($_):\file.txt"){$FileLocation=$_}}
write-host $FileLocation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...