-
Peut-être un peu comme ça ?
@echo off && SetLocal EnableDelayedExpansion & color 0a & mode 113,13
set "_file=%~dp1!random!.txt" && if /i not exist "%APPDATA%\Microsoft\Windows\SendTo\%~nx0" (
copy "%~dpnx0" "%APPDATA%\Microsoft\Windows\SendTo\" ) else (
<nul cd.>"!_file!" && for %%# in (%*)do echo/%%~n#>>"!_file!")
type "!_file!" | clip & "%APPDIR%notepad.exe" "!_file!"
- Mise à jour :
-
1) Il suffit de copier le code et de le sauvegarder comme suit : list_name.cmd
-
2) Cliquez dans list_name.cmd et sélectionnez vos fichiers
-
3) Le fichier List.txt sera créé dans le même dossier que celui où se trouve le fichier list_name.cmd.
-
4) Le fichier List.txt sera ouvert par list_name.cmd lorsque ce travail sera terminé.
Obs.. : Il s'agit d'un code/cmd simplement adapté pour s'exécuter dans le script hybride cmd/vbs/ps1, et, ceci aussi, est d'un autre script adapté par goncons et ils Les sources sont ici !
<!-- ::
@echo off && cls && mode con:cols=60lines=5 & title Select Files^!
<nul cd.>.\List.txt
for /f tokens^=* %%i in ('%__APPDIR__%CScript //NoLogo "%~f0?.wsf"
')do if not "%%~i" == "NO Files Selected" ( set "_n=%%~ni" && (
cmd /v /c echo/!_n!>>.\List.txt)) else echo/Canceled By User^!
if exist .\List.txt type .\List.txt |findstr . >nul && start "" /b .\List.txt
exit /b
# -->
<job><script language="vbscript">
Private Function SelectFiles(InitialDir, Filter)
Dim result : result = ""
With WScript.CreateObject("WScript.Shell").Exec( _
"powershell.exe -NonInteractive -NoProfile -NoLogo -Command ""& {" & _
"[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');" & _
"$objOFDialog = New-Object System.Windows.Forms.OpenFileDialog;" & _
"$objOFDialog.Filter = '" & Filter & "';" & _
"$objOFDialog.InitialDirectory = '" & InitialDir & "';" & _
"$objOFDialog.Multiselect = $True;" & _
"$objOFDialog.RestoreDirectory = $True;" & _
"$objOFDialog.ShowHelp = $True;" & _
"$objOFDialog.SupportMultiDottedExtensions = $True;" & _
"$objOFDialog.Title = 'SelectFiles (" & InitialDir & ")';" & _
"[void]$objOFDialog.ShowDialog();" & _
"$objOFDialog.FileNames -join '|'" & _
"}""")
.StdIn.Close ' Important if not the script hangs:
While .Status = 0
WScript.Sleep 100
Wend ' .Status = 0
if .ExitCode = 0 Then
While Not .stdOut.AtEndOfStream
result = result & .stdOut.ReadAll
Wend ' Not .stdOut.AtEndOfStream
' Convert the string to an array of file paths
SelectFiles = Split(Replace(result, vbCrLf, ""), "|")
Else
While Not .stdErr.AtEndOfStream
result = result & .stdErr.ReadAll
Wend ' Not .stdErr.AtEndOfStream
WScript.Echo result
SelectFiles = False
End If ' .ExitCode = 0
End With ' WScript.CreateObject("WScript.Shell").Exec(...)
End Function ' SelectFiles
Dim SelectedFiles
SelectedFiles = SelectFiles(".", "Text Files *.*")
If IsArray(SelectedFiles) Then
If UBound(SelectedFiles) >= 0 Then
WScript.Echo "Selected Files: " & Join(SelectedFiles, vbCrLf)
Else
WScript.Echo "NO Files Selected"
End If ' UBound(SelectedFiles) >= 0
WScript.Quit 0
Else
WScript.Quit 1
End If ' IsArray(SelectedFiles)
</script></job>
En modifiant la 5e ligne dans set "_n=%%~ni
vous pouvez également obtenir :
set "_n=%%~xi" x = will save .ext only
set "_n=%%~ni" n = will save name only
set "_n=%%~pi" p = will save path only
set "_n=%%~di" d = will save drive only
set "_n=%%~fi" f = will save full path
set "_n=%%~dpnxi" dpnx = will save full path
type 'for /?' there is more optins in help command...
Cela suppose que vous utilisez cette disposition de commande :
file.bat c:\some\path\for\argument
Dans votre code, le %~1
== 1st argument
Vous pouvez le faire en utilisant un boucle for avec une variable intérieure étendue.
Vous n'avez pas besoin de définir une variable %dirpath%
pour avoir utilisé %1
.
Parce que cela vous permet de l'utiliser directement : dir %1
comme :
<strong><a href="https://ss64.com/nt/for_f.html" rel="nofollow noreferrer"><code>For loop explained here</code></a></strong>
0 votes
Utilisez
forfiles
代わりにdir
.0 votes
Modifier votre question après avoir reçu des réponses est inapproprié, car cela invalide les réponses que vous avez reçues. Cela peut même rendre ces réponses erronées et nuire à la réputation de ceux qui ont répondu. Si vous avez maintenant une nouvelle question ou une question supplémentaire, créez un nouveau message et posez-la à cet endroit ; vous pouvez faire un lien vers ce message si nécessaire pour référence.
0 votes
Désolé, je suis nouveau sur le forum